【天梯赛练习题(c语言)】
天梯賽練習題(c語言)
1、L1-007 念數字 (10 分)
輸入一個整數,輸出每個數字對應的拼音。當整數為負數時,先輸出fu字。十個數字對應的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
輸入格式:
輸入在一行中給出一個整數,如:1234。
提示:整數包括負數、零和正數。
輸出格式:
在一行中輸出這個整數對應的拼音,每個數字的拼音之間用空格分開,行末沒有最后的空格。如 yi er san si。
輸入樣例:
-600
輸出樣例:
fu liu ling ling
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 讀入一個數字
Scanner input = new Scanner(System.in);
int num = input.nextInt();
input.close();
// 判斷是否是負數,并控制打印形式
if (num < 0) {
System.out.print(“fu” + " ");
// 負數要找到絕對值去讀
int num_abs = Math.abs(num);
read(num_abs);
} else {
read(num);
}
}
}
2、L1-016 查驗身份證 (15 分)
一個合法的身份證號碼由17位地區、日期編號和順序編號加1位校驗碼組成。校驗碼的計算規則如下:
首先對前17位數字加權求和,權重分配為:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后將計算的和對11取模得到值Z;最后按照以下關系對應Z值與校驗碼M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
現在給定一些身份證號碼,請你驗證校驗碼的有效性,并輸出有問題的號碼。
輸入格式:
輸入第一行給出正整數N(≤100)是輸入的身份證號碼的個數。隨后N行,每行給出1個18位身份證號碼。
輸出格式:
按照輸入的順序每行輸出1個有問題的身份證號碼。這里并不檢驗前17位是否合理,只檢查前17位是否全為數字且最后1位校驗碼計算準確。如果所有號碼都正常,則輸出All passed。
輸入樣例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
輸出樣例1:
12010X198901011234
110108196711301866
37070419881216001X
輸入樣例2:
2
320124198808240056
110108196711301862
輸出樣例2:
All passed
// #include <stdio.h>
int main (){
int q[17] = {7, 9, 10, 5, 8, 4, 2, 1,6, 3, 7, 9, 10, 5, 8, 4, 2};
int idz[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
char idm[12] = “10X98765432”;
int n, sum[101] = {0}, t[101] = {0};
char str[101][19];
scanf ("%d", &n);
for (int i=0; i<n; i++)
scanf ("%s", str[i]);
for (int i=0; i<n; i++){
int flag = 0;
for (int j=0; j<17; j++)
if (str[i][j]>=‘0’ && str[i][j]<=‘9’)
flag++;
if (flag==17){
for (int j=0; j<17; j++)
sum[i] += (str[i][j]-48)*q[j];
sum[i] %= 11;
if (str[i][17] != idm[sum[i]])
t[i] = 1;
}
else
t[i] = 1;
}
int count = 1, flag1 = 1;
for (int i=0; i<n; i++)
if (t[i]){
if (flag1){
printf ("%s", str[i]);
flag1 = 0;
}
else
printf ("\n%s", str[i]);
count = 0;
}
if (n)
if (count)
printf (“All passed\n”);
return 0;
}
3、L1-047 裝睡 (10 分)
你永遠叫不醒一個裝睡的人 —— 但是通過分析一個人的呼吸頻率和脈搏,你可以發現誰在裝睡!醫生告訴我們,正常人睡眠時的呼吸頻率是每分鐘15-20次,脈搏是每分鐘50-70次。下面給定一系列人的呼吸頻率與脈搏,請你找出他們中間有可能在裝睡的人,即至少一項指標不在正常范圍內的人。
輸入格式:
輸入在第一行給出一個正整數N(≤10)。隨后N行,每行給出一個人的名字(僅由英文字母組成的、長度不超過3個字符的串)、其呼吸頻率和脈搏(均為不超過100的正整數)。
輸出格式:
按照輸入順序檢查每個人,如果其至少一項指標不在正常范圍內,則輸出其名字,每個名字占一行。
輸入樣例:
4
Amy 15 70
Tom 14 60
Joe 18 50
Zoe 21 71
輸出樣例:
Tom
Zoe
#include"stdio.h"
#include"stdlib.h"
int main()
{
int n;
int i;
char a[10][4];
int b[10],c[10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
scanf("%d",&b[i]);
scanf("%d",&c[i]);
if(b[i]<15||b[i]>20)
printf("%s\n",a[i]);
else if(c[i]<50||c[i]>70)
printf("%s\n",a[i]);
}
return 0;
}
4、L1-056 猜數字 (20 分)
一群人坐在一起,每人猜一個 100 以內的數,誰的數字最接近大家平均數的一半就贏。本題就要求你找出其中的贏家。
輸入格式:
輸入在第一行給出一個正整數N(≤104)。隨后 N 行,每行給出一個玩家的名字(由不超過8個英文字母組成的字符串)和其猜的正整數(≤ 100)。
輸出格式:
在一行中順序輸出:大家平均數的一半(只輸出整數部分)、贏家的名字,其間以空格分隔。題目保證贏家是唯一的。
輸入樣例:
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
輸出樣例:
22 Amy
#include<stdio.h>
#include<math.h>
struct prople{
int num;
int name[10];
}p[10000],pmin;//pmin表示最小值
int main (void)
{
int i,n,sum=0;
double half;//half表示平均數的一半
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s %d",p[i].name,&p[i].num);
sum=sum+p[i].num;
}
half=sum1.0/n0.5;
pmin=p[0];
for(i=0;i<n;i++)
{
if(fabs(pmin.num-half)>fabs(p[i].num-half))//最接近平均數的一半
pmin=p[i];
}
printf("%.0f %s",half,pmin.name);
return 0;
}
5、L1-070 吃火鍋 (15 分)
以上圖片來自微信朋友圈:這種天氣你有什么破事打電話給我基本沒用。但是如果你說“吃火鍋”,那就厲害了,我們的故事就開始了。
本題要求你實現一個程序,自動檢查你朋友給你發來的信息里有沒有 chi1 huo3 guo1。
輸入格式:
輸入每行給出一句不超過 80 個字符的、以回車結尾的朋友信息,信息為非空字符串,僅包括字母、數字、空格、可見的半角標點符號。當讀到某一行只有一個英文句點 . 時,輸入結束,此行不算在朋友信息里。
輸出格式:
首先在一行中輸出朋友信息的總條數。然后對朋友的每一行信息,檢查其中是否包含 chi1 huo3 guo1,并且統計這樣厲害的信息有多少條。在第二行中首先輸出第一次出現 chi1 huo3 guo1 的信息是第幾條(從 1 開始計數),然后輸出這類信息的總條數,其間以一個空格分隔。題目保證輸出的所有數字不超過 100。
如果朋友從頭到尾都沒提 chi1 huo3 guo1 這個關鍵詞,則在第二行輸出一個表情 --#。
輸入樣例 1:
Hello!
are you there?
wantta chi1 huo3 guo1?
that’s so li hai le
our story begins from chi1 huo3 guo1 le
.輸出樣例 1:
5
3 2
輸入樣例 2:
Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that’s so li hai le
our story begins from ci1 huo4 guo2 le
.輸出樣例 2:
5
--#
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char str[85];
int first_index=-1;//第一個符合的未知
int s_count=0;//總輸入的個數
int t_count=0;//符合的個數
int main(){
while(1){
gets(str);//一次輸入每一句話
if(strcmp(".",str)0)
break;
s_count++;//輸入的全部個數
char *p=strstr(str,“chi1 huo3 guo1”);//str是被查找字符串,后面的“ ”里面是需要超找的字符串
if(p!=NULL){
if(first_index<0)
first_index=s_count;//判斷第一次出現所在的未知
t_count++;//存在吃火鍋的個數
}
}
printf("%d\n",s_count);
if(t_count0)
printf("-_-#");
else
printf("%d %d\n",first_index,t_count);
}
6、L1-074 兩小時學完C語言 (5 分)
知乎上有個寶寶問:“兩個小時內如何學完 C 語言?”當然,問的是“學完”并不是“學會”。
假設一本 C 語言教科書有 N 個字,這個寶寶每分鐘能看 K 個字,看了 M 分鐘。還剩多少字沒有看?
輸入格式:
輸入在一行中給出 3 個正整數,分別是 N(不超過 400 000),教科書的總字數;K(不超過 3 000),是寶寶每分鐘能看的字數;M(不超過 120),是寶寶看書的分鐘數。
題目保證寶寶看完的字數不超過 N。
輸出格式:
在一行中輸出寶寶還沒有看的字數。
輸入樣例:
100000 1000 72
輸出樣例:
28000
#include<stdio.h>
int main()
{int n,k,m;
scanf("%d %d %d",&n,&k,&m);
printf("%d",n-m*k);
return 0;
}
7、L1-073 人與神 (5 分)
跨界大神 L. Peter Deutsch 有一句名言:“To iterate is human, to recurse divine.”(迭代的是人,遞歸的是神)。本題就請你直接在屏幕上輸出這句話。
輸入格式:
本題沒有輸入。
輸出格式:
在一行中輸出 To iterate is human, to recurse divine.。
輸入樣例:
無
輸出樣例:
To iterate is human, to recurse divine.
#include<stdio.h>
int main()
{
printf(“To iterate is human, to recurse divine.”);
return 0;
}
8、L2-014 列車調度 (25 分)
火車站的列車調度鐵軌的結構如下圖所示。
兩端分別是一條入口(Entrance)軌道和一條出口(Exit)軌道,它們之間有N條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最后從出口離開。在圖中有9趟列車,在入口處按照{8,4,2,5,3,9,1,6,7}的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則至少需要多少條平行鐵軌用于調度?
輸入格式:
輸入第一行給出一個整數N (2 ≤ N ≤105),下一行給出從1到N的整數序號的一個重排列。數字間以空格分隔。
輸出格式:
在一行中輸出可以將輸入的列車按序號遞減的順序調離所需要的最少的鐵軌條數。
輸入樣例:
9
8 4 2 5 3 9 1 6 7
輸出樣例:
4
#include<bits/stdc++.h>
using namespace std;
const int maxn = 123456;
const int INF = 1 << 30;
int a[maxn];
int main() {
#ifdef MyTest
freopen(“Sakura.txt”, “r”, stdin);
#endif
int n;
scanf("%d", &n);
fill(a, a + n, INF);
for(int i = 0; i < n; ++i) {
int x;
scanf("%d", &x);
*lower_bound(a, a + n, x) = x;
}
cout << lower_bound(a, a + n, INF) - a;
return 0;
}
9、L2-017 人以群分 (25 分)
社交網絡中我們給每個人定義了一個“活躍度”,現希望根據這個指標把人群分為兩大類,即外向型(outgoing,即活躍度高的)和內向型(introverted,即活躍度低的)。要求兩類人群的規模盡可能接近,而他們的總活躍度差距盡可能拉開。
輸入格式:
輸入第一行給出一個正整數N(2≤N≤105)。隨后一行給出N個正整數,分別是每個人的活躍度,其間以空格分隔。題目保證這些數字以及它們的和都不會超過231。
輸出格式:
按下列格式輸出:
Outgoing #: N1
Introverted #: N2
Diff = N3
其中N1是外向型人的個數;N2是內向型人的個數;N3是兩群人總活躍度之差的絕對值。
輸入樣例1:
10
23 8 10 99 46 2333 46 1 666 555
輸出樣例1:
Outgoing #: 5
Introverted #: 5
Diff = 3611
輸入樣例2:
13
110 79 218 69 3721 100 29 135 2 6 13 5188 85
輸出樣例2:
Outgoing #: 7
Introverted #: 6
Diff = 9359
#include<bits/stdc++.h>
using namespace std;
int main() {
#ifdef MyTest
freopen(“Sakura.txt”, “r”, stdin);
#endif
int n, ans = 0;
cin >> n;
int y = n / 2, x = n - y;
cout << "Outgoing #: " << x << ‘\n’;
cout << "Introverted #: " << y << ‘\n’;
vector v(n);
for(int i = 0; i < n; i++) cin >> v[i];
sort(v.begin(), v.end(), greater());
for(int i = 0; i< x; i++) ans += v[i];
for(int i = x; i < n; i++) ans -=v[i];
cout << "Diff = " << ans;
return 0;
}
10、L3-022 地鐵一日游 (30 分)
森森喜歡坐地鐵。這個假期,他終于來到了傳說中的地鐵之城——魔都,打算好好過一把坐地鐵的癮!
魔都地鐵的計價規則是:起步價 2 元,出發站與到達站的最短距離(即計費距離)每 K 公里增加 1 元車費。
例如取 K = 10,動安寺站離魔都綠橋站為 40 公里,則車費為 2 + 4 = 6 元。
為了獲得最大的滿足感,森森決定用以下的方式坐地鐵:在某一站上車(不妨設為地鐵站 A),則對于所有車費相同的到達站,森森只會在計費距離最遠的站或線路末端站點出站,然后用森森美圖 App 在站點外拍一張認證照,再按同樣的方式前往下一個站點。
坐著坐著,森森突然好奇起來:在給定出發站的情況下(在出發時森森也會拍一張照),他的整個旅程中能夠留下哪些站點的認證照?
地鐵是鐵路運輸的一種形式,指在地下運行為主的城市軌道交通系統。一般來說,地鐵由若干個站點組成,并有多條不同的線路雙向行駛,可類比公交車,當兩條或更多條線路經過同一個站點時,可進行換乘,更換自己所乘坐的線路。舉例來說,魔都 1 號線和 2 號線都經過人民廣場站,則乘坐 1 號線到達人民廣場時就可以換乘到 2 號線前往 2 號線的各個站點。換乘不需出站(也拍不到認證照),因此森森乘坐地鐵時換乘不受限制。
輸入格式:
輸入第一行是三個正整數 N、M 和 K,表示魔都地鐵有 N 個車站 (1 ≤ N ≤ 200),M 條線路 (1 ≤ M ≤ 1500),最短距離每超過 K 公里 (1 ≤ K ≤ 106),加 1 元車費。
接下來 M 行,每行由以下格式組成:
<站點1><空格><距離><空格><站點2><空格><距離><空格><站點3> … <站點X-1><空格><距離><空格><站點X>
其中站點是一個 1 到 N 的編號;兩個站點編號之間的距離指兩個站在該線路上的距離。兩站之間距離是一個不大于 106 的正整數。一條線路上的站點互不相同。
注意:兩個站之間可能有多條直接連接的線路,且距離不一定相等。
再接下來有一個正整數 Q (1 ≤ Q ≤ 200),表示森森嘗試從 Q 個站點出發。
最后有 Q 行,每行一個正整數 Xi,表示森森嘗試從編號為 Xi 的站點出發。
輸出格式:
對于森森每個嘗試的站點,輸出一行若干個整數,表示能夠到達的站點編號。站點編號從小到大排序。
輸入樣例:
6 2 6
1 6 2 4 3 1 4
5 6 2 6 6
4
2
3
4
5
輸出樣例:
1 2 4 5 6
1 2 3 4 5 6
1 2 4 5 6
1 2 4 5 6
#include
#include
#include
using namespace std;
struct Line {
int visited = 0, end = 0; //end為端點標記
vector road;
}line[201];
int graph[201][201];
const long long MAX = 100000001;
void search(int i, const int& vis) {
for (auto& it : line[i].road) {
if (line[it].visited != vis) {
line[it].visited = vis;
search(it, vis);
}
}
}
int main() {
int n, m, k, dis, a, b, q, start;
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
graph[i][j] = MAX;
for (int i = 0; i < m; i++) {
scanf("%d", &a); //錄入數據
line[a].end = 1; //端點標記
do {
scanf("%d%d", &dis, &b);
if (graph[a][b] > dis) {
graph[a][b] = graph[b][a] = dis;
}
a = b;
} while (getchar() != ‘\n’);
line[a].end = 1; //端點標記
}
for (int k = 1; k <= n; k++) //弗洛伊德多源最短路徑
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i != j && graph[i][j] > graph[i][k] + graph[k][j])
graph[i][j] = graph[i][k] + graph[k][j];
for (int i = 1; i <= n; i++) {
map<int, int> mp;
for (int j = 1; j <= n; j++) //尋找每個費用的最遠距離
if (graph[i][j] != MAX && graph[i][j] > mp[2 + graph[i][j] / k])
mp[2 + graph[i][j] / k] = graph[i][j];
for (int j = 1; j <= n; j++) //錄入數據,構建鄰接表
if (graph[i][j] == mp[2 + graph[i][j] / k] || (i != j && line[j].end && graph[i][j] != MAX))
line[i].road.push_back(j);
}
scanf("%d", &q);
int flag;
for (int i = 1; i <= q; i++) {
scanf("%d", &start);
line[start].visited = i;
flag = 0;
search(start, i); //搜索
for (int j = 1; j <= n; j++)
if (line[j].visited == i) {
printf("%s%d", flag ? " " : “”, j);
flag = 1;
}
cout << endl;
}
return 0;
}
總結
以上是生活随笔為你收集整理的【天梯赛练习题(c语言)】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】解决可恶的 “NIC Li
- 下一篇: FPU