卡在出线概率了。40%,没想到遍历时反了,我去。
1.时钟加法
题目描述
小南最近迷上了各种形式的加法,例如时钟加法,时钟加法是指给定一个当前时间,其形式为h:m:s,计算加上n秒后新的时间。你能帮他编程实现吗?
输入
多个样例。每个样例输入1行形式为h:m:s+n的数据,其中h(0≤h≤23)代表小时,m(0≤m≤59)代表分钟,s(0≤s≤59)代表秒钟,n(1≤n≤105)代表经过的秒数。
输出
每个样例输出新的时间,形式为h:m:s。每个样例输出结果占一行。
样例输入 Copy
0:0:0+360 23:29:59+1801 7:8:15+1
样例输出 Copy
00:06:00 00:00:00 07:08:16
1 #include<stdio.h>
2
3 #include<string.h>
4
5 #include<stdlib.h>
6
7 #include<math.h>
8 #define CRT_SECURE_NO_WARNINGS
9
10
11 void Print(int x) {
12
13
14 if (x < 10) {
15 printf("0%d", x);
16 }
17 else {
18 printf("%d", x);
19 }
20
21
22 }
23
24 int main()
25 {
26 int a;
27 int b;
28 int c;
29 int n;
30 while (scanf("%d:%d:%d+%d", &a,&b,&c,&n) != EOF) {
31
32
33 int t = a * 3600 + b * 60 + c * 1 + n;
34 //printf("t=%d\n", t);
35 if (t == 86400) {
36 printf("00:00:00\n");
37 }
38 else {
39
40
41
42 int r1 = t / 3600;
43 r1 %= 24;
44 int m2 = t % 3600;
45
46 int r2 = m2 / 60;
47
48 int m3 = m2 % 60;
49
50 int r3 = m3;
51
52 Print(r1);
53 printf(":");
54
55 Print(r2);
56 printf(":");
57
58 Print(r3);
59 printf("\n");
60
61
62 }
63
64
65
66 }
67
68 return 0;
69 }
2.卡牌排序
题目描述
小南有一个习惯,他喜欢将所有卡牌按照牌面数字的奇偶性分类并由小到大排序好,由于他最近实验课非常多,他想让优秀的你帮帮他。
输入
多个样例。每个样例包含2行输入:
第1行输入一个正整数n(2≤n≤10000)表示卡牌数的张数,第2行输入n个正整数ai (ai 满足int类型范围)表示卡牌牌面上的数字,奇数和偶数的个数大于等于1。
输出
每个样例输出2行,第1行是由小到大排序好的奇数数字卡牌,第2行是由小到大排序好的偶数数字卡牌,数字之间用1个空格分开。每两个样例的输出结果之间用1个空行分开。
样例输入 Copy
5
1 6 9 7 2
2
6 101
样例输出 Copy
1 7 9
2 6
101
6
1 #include<stdio.h>
2
3 #include<string.h>
4
5 #include<stdlib.h>
6
7 #include<math.h>
8 #define CRT_SECURE_NO_WARNINGS
9
10 int e[10005];
11 int o[10005];
12 int main()
13 {
14 int a;
15 while (scanf("%d", &a) != EOF) {
16 memset(e, 0, sizeof(e));
17 memset(o, 0, sizeof(o));
18 int num;
19
20 int b = a;
21 int cnt1 = 0, cnt2 = 0;
22 for (int i = 0; i < b; ++i) {
23
24 scanf("%d", &num);
25
26 if (num % 2 == 1) {
27
28 o[cnt1] = num;
29 cnt1++;
30 }
31 else {
32
33 e[cnt2] = num;
34 cnt2++;
35 }
36
37
38
39 }
40
41 //sort
42 for (int j = 0; j < cnt1 - 1; ++j) {
43 for (int i = 0; i < cnt1 - 1 - j; ++i) {
44
45 if (o[i] > o[i + 1]) {
46 int t = o[i];
47 o[i] = o[i + 1];
48 o[i + 1] = t;
49 }
50
51 }
52 }
53
54
55 for (int j = 0; j < cnt2- 1; ++j) {
56 for (int i = 0; i < cnt2 - 1 - j; ++i) {
57
58 if (e[i] > e[i + 1]) {
59 int t = e[i];
60 e[i] = e[i + 1];
61 e[i + 1] = t;
62 }
63
64 }
65 }
66
67
68 for (int i = 0; i < cnt1; ++i) {
69 printf("%d ", o[i]);
70 }
71 printf("\n");
72
73 for (int i = 0; i < cnt2; ++i) {
74 printf("%d ", e[i]);
75 }
76
77 printf("\n\n");
78
79
80 }
81
82 return 0;
83 }
3.小南找书
题目描述
小南热心志愿者活动,有时间的时候会在图书馆帮忙整理书籍。图书馆有一个很大的书架,书架一共有n(1≤n≤103)层,第i层上放了ai (1 ≤ ai ≤ 103)本书。每本书用连续的数字进行了编号:第1层书架上的书从1号到a1号,第2层放的书是从a1+1号到a1 + a2号,以此类推。
例如:当n等于2,a1为1,a2为3时,第1层书架上的1本书编号为1,第2层书架上的3本书编号依次为2、3、4。
小南想让你帮他编程实现,对于给定的书的编号,快速找到这本书在书架的第几层上。
说明:数组定义时如果长度大于106,有些编译器需要定为外部变量。
输入
多个样例。 每个样例输入包括4行:
第1行输入一个整数n (1≤n≤ 103),代表书架的层数。
第2行输入n个整数a1, a2, ..., an (1≤ai ≤103,a1+a2+...+ an ≤106),其中ai代表第i层书架上的书的数量。
第3行输入一个整数m (1≤m≤103)代表小南要找的书的数量。
第4行输入m个整数b1, b2, ...,bm(1 ≤ bi ≤a1+a2+...+ an),分别表示小南要找的m本书的编号。
输出
每个样例输出m行,第i行包含一个整数,代表编号为 bi的书所在的书架的层数。
样例输入 Copy
2 1 3 2 1 3 5 1 8 3 5 8 3 1 24 11
样例输出 Copy
1 2 1 5 3
1 #include<stdio.h>
2
3 #include<string.h>
4
5 #include<stdlib.h>
6
7 #include<math.h>
8 #define CRT_SECURE_NO_WARNINGS
9
10 int main()
11 {
12 int n;
13
14 while (scanf("%d", &n) != EOF) {
15 int arr[1005][2] = {0};
16 //memset(arr[0][0], 0, sizeof(arr));
17
18 int ai;
19 int sum = 0;
20 int pre = 0;
21
22 for (int i = 1; i <= n; ++i) {
23 scanf("%d", &ai);
24
25 sum += ai;
26
27 if (pre == 0) {
28 arr[i][0] = 0;
29
30 arr[i][1] = sum;
31
32 }
33 else {
34 arr[i][0] = pre + 1;
35
36 arr[i][1] = sum;
37
38 }
39 pre = arr[i][1];
40
41 }
42
43
44
45 int m;
46 scanf("%d", &m);
47
48 int mb;
49
50 for (int i = 1; i <= m; ++i) {
51
52 //query
53 scanf("%d",& mb);
54
55
56 for (int i = 1; i <= n; ++i) {
57
58 if (arr[i][0] <= mb && arr[i][1] >= mb) {
59 printf("%d\n", i);
60 break;
61 }
62
63
64 }
65
66
67 }
68
69
70 // Print
71 /* for (int i = 1; i <= n; ++i) {
72 printf("%d %d\n", arr[i][0], arr[i][1]);
73 }*/
74
75
76 }
77
78 return 0;
79 }
4.出线概率
题目描述
2022世界杯正在火热进行中,小南是足球球迷,想知道某个球队的出线概率。经过严肃认真的研究,他发现其出线概率是一种可以计算的玄学:根据球队的名字可以得到出线概率!球队的名字由n(1≤n≤30)个小写字母c1, c2, ..., cn组成,小写字母只包括'a'~'i',其编号分别对应1~9,则出线概率的计算公式为:
((-1)1*(c1对应的编号)*101 +(-1)2*(c2对应的编号)*102 + ... (-1)n*(cn对应的编号)*10n )/10n+1
最终结果保留到小数点后n位。例如当球队名字为fff时,f字母对应的编号是6,则出线概率为:(-60+600-6000)/10000=-0.546。
给定某个球队的名字,请你帮助小南计算一下该球队出现在下次世界杯的概率吧!注意有些球队的名字组成很长哦,最大可达30位呢。
输入
多个样例。每个样例输入1行包含一个由小写字母组成的字符串(小写字母只包括'a'~'i'),表示球队的名字,长度为n(1≤n≤30)。
输出
每个样例输出一个实数表示出线概率,保留到小数点后n位。
样例输入 Copy
fff aaaa
样例输出 Copy
-0.546 0.0909
1 #include<stdio.h>
2
3 #include<string.h>
4
5 #include<stdlib.h>
6
7 #include<math.h>
8 #define CRT_SECURE_NO_WARNINGS
9
10 #define long long ll
11
12
13
14 void Print(int x) {
15
16
17 if (x < 10) {
18 printf("0%d", x);
19 }
20 else {
21 printf("%d", x);
22 }
23
24
25 }
26 char s[10005];
27 int main()
28 {
29
30 while (scanf("%s", &s) != EOF) {
31
32
33 int len = strlen(s);
34
35 //printf("%d", len);
36
37 if (len % 2 == 1) {
38 printf("-");
39 }
40
41 printf("0.");
42
43 if (len % 2 == 1) {
44
45 /*for (int i = 0; i <= len - 2; i +=2) {
46
47 char c2 = s[i] - 'a' + 1;
48 char c1= s[i + 1] - 'a' + 1;
49
50 int n = c1 * 10 - c2;
51
52 Print(n);
53
54 }*/
55
56 for (int i = len -1 ; i >= 1; i -= 2) {
57
58 char c1 = s[i] - 'a' + 1;
59 char c2 = s[i - 1] - 'a' + 1;
60
61 int n = c1 * 10 - c2;
62
63 Print(n);
64
65 }
66
67
68 printf("%d\n", s[0] - 'a' + 1);
69
70
71 //printf("%d", s[0] - 'a' + 1);
72
73 }
74 else if (len % 2 == 0) {
75
76
77
78 for (int i = len - 1; i >= 0 ; i -= 2) {
79
80 char c1 = s[i] - 'a' + 1;
81 char c2 = s[i - 1] - 'a' + 1;
82
83 int n = c1 * 10 - c2;
84
85 Print(n);
86
87 }
88 printf("\n");
89
90 //printf("%d\n", s[len - 1] - 'a' + 1);
91
92
93
94
95 }
96
97
98 }
99
100 return 0;
101 }
5.地铁出行
题目描述
长沙地铁票有两种优惠方式,一种是月票,价格为100元;一种是消费打折,打折的规则为:本次乘车前总消费不足 10 元本次不打折,满 10 元不足 15 元本次打8 折,满 15 元不足 40 元本次打 5 折,已满 40 元后本次不打折。
例如:小南11月份乘坐了3次地铁,原价分别是10元、8元、2元,则第1次由于前面的消费为0元,因此不打折,小南花费10元;第2次的时候由于前面消费满了10元,因此8元的原票价打8折,即花费6.4元;第3次消费的时候前面累计消费了16.4元,因此2元的原票价打5折,即花费1元。那么小南11月份的实际地铁出行费用是17.4元。
小南在2022年买的是地铁月票,已知小南某月出行的次数和每次出行的原票价,请问他购买月票的决定是否正确?即消费打折后的实际地铁出行费用大于等于月票价格,则认定为正确,否则认定为不正确。
输入
多个样例。 每个样例输入包含2行:
第1行一个整数n(1≤n≤100)代表小南某月出行的次数,第2行 n 个正整数ai (1 ≤ ai ≤ 50)代表每次出行的原票价,小南是按照输入顺序依次出行的。
输出
对于每个样例,如果小南购买月票的决定正确就输出Yes,否则输出No。每个样例结果输出占一行。
样例输入 Copy
3 10 8 2 8 10 10 10 20 20 20 20 20
样例输出 Copy
No Yes
1 #include<stdio.h>
2
3 #include<string.h>
4
5 #include<stdlib.h>
6
7 #include<math.h>
8 #define CRT_SECURE_NO_WARNINGS
9
10 int main()
11 {
12 int n;
13 while (scanf("%d", &n) != EOF) {
14
15 int A =100;
16 int B = 0;
17
18 float sum = 0;
19
20
21
22 float price = 0 ;
23
24 for (int i = 0; i < n; ++i) {
25
26 scanf("%f", &price);
27 // printf("price=%f\n", price);
28 if (sum < 10) {
29 price = price;
30 }
31 else if (sum >= 10 && sum < 15) {
32 price = 0.8 * price;
33 }
34 else if (sum >= 15 && sum < 40) {
35 price = 0.5 * price;
36 }
37 else if (sum >= 40) {
38 price = price;
39 }
40
41 sum += price;
42
43
44 //printf("sum=%f\n", sum);
45
46
47 }
48
49 if (A <= sum) {
50 printf("Yes\n");
51 }
52 else {
53 printf("No\n");
54 }
55
56
57
58
59 }
60
61 return 0;
62 }
6.填数游戏
题目描述
小南是个素数爱好者,设计了一种与素数有关的填数游戏。该游戏的要求是:输入一个长度为n(1≤n≤10000)的数字串(由数字1~9组成,没有数字0)和一个正整数m(1≤m≤4),将数字串从左边开始,每取m位数字构成一个整数保存起来,剩余的不够m位的也构成一个整数。接下来,他将这些整数ai 按照以下四种特性进行分类:
(1)1类:整数ai 是素数,素数是指除了1和本身外不能被其他数整除的正整数,2是最小的素数。
(2)2类:整数ai 组成的各位数字之和是素数,如整数11的数字之和为2,是素数,满足该条件。
(3)3类:整数ai 组成的各位数字中至少有一个是素数,如整数123中,有素数数字2,满足该条件。
(4)4类:不满足前3类的其他整数。
数据分类按照1类、2类、3类和4类的顺序进行。例如整数223虽然满足1类、2类和3类特性,按照顺序归入1类;25满足2类和3类特性,按照顺序归入2类。接下来小南将这4类整数分别填入一个k*k的方阵中,k为奇数,满足3≤k≤101。该方阵用星号“*”分割成上三角形、左三角形、下三角形和右三角形四个部分,上三角形填入1类整数、左三角形填入2类整数、右三角形填入3类整数、下三角形填入4类整数。填数的过程按照整数出现的顺序从上到下从左至右进行,如果填不满则填充数字0,每个数据输出占5位,右对齐,方阵k的选择要求所有数据都可以按照要求填入且填入的0的个数最少。
说明:当输入的n位数字串为123456789123456789,输入的m为2时,整数分割情况如下:
1类整数:23、67、89
2类整数:12、34、56
3类整数:78、45
4类整数:91
选定的k为5时的填充情况如图1所示,选定的k为7时的填充情况如图2所示。根据题目要求填入的0的个数最少,则图1是正确的结果。
现有给定的n位数字串和正整数m,请你帮助小南编程实现输出正确的填充结果。
输入
多个样例。 每个样例输入一行包含一个n(1≤n≤10000)位数字串(由数字1~9组成,没有数字0)和正整数m(1≤n≤4) 。
输出
每个样例按照填充要求输出一个正确的方阵图。输出的整数和星号“*”的位数都是5位,右对齐。每两个样例的输出结果之间用一个空行分开。
样例输入 Copy
123456789123456789 2 1234567 1
样例输出 Copy
* 23 67 89 * 12 * 0 * 78 34 56 * 45 0 0 * 91 * 0 * 0 0 0 * * 2 3 5 * 0 * 7 * 0 0 0 * 0 0 0 * 1 * 0 * 4 6 0 *
1 #include<stdio.h>
2
3 #include<string.h>
4
5 #include<stdlib.h>
6
7 #include<math.h>
8 #define CRT_SECURE_NO_WARNINGS
9
10
11 int c1(int n) {
12
13 int i;
14 if (n == 1 || n == 0) {
15 return 0;
16 }
17 for (i = 2; i <= sqrt(n); i++)
18 {
19 if (n % i == 0) // 如果不为素数返回0
20 {
21 return 0;
22 }
23 }
24 return 1; // 反之则返回1
25
26 }
27
28
29 int c2(int n) {
30
31 int m = n;
32
33 int sum = 0;
34 while (m != 0) {
35
36 sum += m % 10;
37 m /= 10;
38
39
40 }
41
42 if (c1(sum) == 1) {
43 return 1;
44 }
45 else {
46 return 0;
47 }
48
49 }
50
51
52 int c3(int n) {
53
54 while (n != 0) {
55
56 int m = n % 10;
57
58 if (m == 2 || m == 3 || m == 5 || m == 7) {
59 return 1;
60 }
61 n /= 10;
62 }
63 return 0;
64
65 }
66
67
68
69
70
71 int main()
72 {
73 char s[10005];
74 int arr[10005];
75 int a1[10005];
76 int a2[10005];
77 int a3[10005];
78 int a4[10005];
79 while (scanf("%s", &s) != EOF) {
80 memset(arr, 0, sizeof(arr));
81
82 int m;
83 scanf("%d", &m);
84
85 int len = strlen(s);
86
87 int quo = len / m;
88
89 int mod = len % m;
90 int cnt = 0;
91
92 for (int i = 0; i < len; i += m) {
93
94 int mul = 1;
95 int num = 0;
96 for (int j = i + m - 1; j >= i; --j) {
97 int t = s[j] - '0';
98 num += t * mul;
99 mul *= 10;
100
101
102 }
103 arr[cnt++] = num;
104
105 }
106
107
108
109 //Print
110 if (mod != 0) {
111 int num = 0;
112 int mul = 1;
113 for (int i = len - 1; i >= quo * m; --i) {
114 int t = s[i] - '0';
115 num += t * mul;
116 mul *= 10;
117
118 }
119 arr[cnt -1 ] = num;
120
121 /*for (int i = 0; i < quo + 1; ++i) {
122 printf("%d ", arr[i]);
123 }*/
124
125 }
126 else if (mod == 0) {
127 /*for (int i = 0; i < quo; ++i) {
128 printf("%d ", arr[i]);
129 }*/
130 }
131
132 int b1 = 0, b2 = 0, b3 = 0, b4 = 0;
133 int rmax = 0;
134 for (int i = 0; i < cnt; ++i) {
135 int n = arr[i];
136
137 if (c1(n) == 1) {
138
139 a1[b1++] = n;
140
141 if (rmax < b1) {
142 rmax = b1;
143 }
144
145
146 }
147 else if (c2(n) == 1) {
148 a2[b2++] = n;
149
150 if (rmax < b2) {
151 rmax = b2;
152 }
153
154 }
155 else if (c3(n) == 1) {
156 a3[b3++] = n;
157
158 if (rmax < b3) {
159 rmax = b3;
160 }
161
162
163 }
164 else {
165 a4[b4++] = n;
166
167
168
169 if (rmax < b4) {
170 rmax = b4;
171 }
172
173 }
174
175 }
176 int k = 3;
177 for ( k = 3; k <= 101; k += 2) {
178
179 int room = (k - 1) / 2 * (k - 1) / 2;
180
181 if (rmax <= room) {
182 break;
183 }
184
185
186
187 }
188 //printf("k=%d", k);
189 int z1 = 0, z2 = 0, z3 = 0, z4 = 0;
190
191
192 // printf("ans:\n\n");
193
194 for (int i = 0; i <k; ++i) {
195
196
197 for (int j = 0; j < k; ++j) {
198
199
200 if (i == j || i + j == k - 1) {
201 char p = '*';
202 printf("%5c",p );
203
204 }
205 else {
206
207 if (i < j && i + j < k - 1) {
208
209
210 if (z1 < b1) {
211 printf("%5d", a1[z1++]);
212 }
213 else {
214 printf("%5d",0);
215 }
216
217 }
218
219 if (i > j && i + j < k - 1) {
220
221
222 if (z2 < b2) {
223 printf("%5d", a2[z2++]);
224 }
225 else {
226 printf("%5d",0);
227 }
228
229
230 }
231
232 if (i < j && i + j > k - 1) {
233
234 if (z3 < b3) {
235 printf("%5d", a3[z3++]);
236 }
237 else {
238 printf("%5d",0);
239 }
240
241 }
242 if (i > j && i + j > k - 1) {
243
244
245 if (z4 < b4) {
246 printf("%5d", a4[z4++]);
247 }
248 else {
249 printf("%5d",0);
250 }
251
252
253 }
254
255
256 }
257
258
259 }
260
261
262
263 printf("\n");
264
265 }
266
267
268
269 printf("\n");
270
271
272 }
273
274 return 0;
275 }