第一部分的培训为语法糖,stl容器以及复杂度。
题目分析
1.1 Long Loong AtCoder - abc336_a
这道题的重点在于多个o的输出。在保证前面‘L’ 的输出和后面‘ng’的输出下,输入需要输出的o的数字,来实现需要输出的效果。
代码如下
#include <stdio.h>
#include <string.h>
int main()
{
int n, i;
scanf("%d", &n);
printf("L");
for (i = 0; i < n; i++) {
printf("o");//这里输出多个o
}
printf("ng");
return 0;
}
1.2 YES or YES? CodeForces-1703A
这道题重点在于不论你输入的yes y,e,s是否大写,都认为是yes,所以输出yes,如果其中有一个字符是错的,那么直接输出no,代码如下
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
int n, i;
char a[10000];
scanf("%d", &n);
for (i = 0; i < n; i++)
{
int flag = 0;
cin >> a;
int k = strlen(a);
if (k == 3)
{
if ((a[0] == 'Y' || a[0] == 'y') && (a[1] == 'E' || a[1] == 'e') &&(a[2] == 's' || a[2] == 'S'))
flag = 1;
}
if (flag == 1)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
1.3 Even? Odd? G 洛谷 P2955 - Virtual Judge
这道题重点在与判断奇数或者偶数。如果只是简单的%2来判断,那么只会拿60分。注意到这个数字长度超出了long long的限制,所以我们考虑用字符串吃入这个数字,再判断最后一位是不是奇数或者偶数,代码如下
#include <stdio.h>
#include <string.h>
int main()
{
int n, i;
char a[10000000];
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%s", a);
int k = strlen(a);
if (a[k - 1] % 2 == 0)
{
printf("even\n");
}
else {
printf("odd\n");
}
}
return 0;
}
1.4 Problem Generator CodeForces - 1980A
这道题目重点在于ABCDEFG 7种难度的题目里面,如果缺哪一种,就得想出相对应的问题。那么我们可以想到我们可以用数组来存储。如果一场比赛,我们有ABCDEF6道题目,那我们就只要想出G题,及一道题,如果对应道数组里面,即是a数组下标0,1,2,3,4,5的值都为1,6的值为0,那么我们就找出那个值小于轮数的成员,再对应算出该成员缺少的问题的数量
代码如下
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solve(int n, int m, std::string a) {
std::vector<int> cnt(7, 0);
for (char c : a) {
if (c == 'A')
cnt[0]++;
else if (c == 'B')
cnt[1]++;
else if (c == 'C')
cnt[2]++;
else if (c == 'D')
cnt[3]++;
else if (c == 'E')
cnt[4]++;
else if (c == 'F')
cnt[5]++;
else if (c == 'G')
cnt[6]++;
}
n = 0;
for (int i = 0; i < 7; ++i) {
if (cnt[i] < m) {
n += m - cnt[i];
}
}
return n;
}
int main() {
int t;
std::cin >> t;
while (t--) {
int n, m;
std::cin >> n >> m;
std::string a;
std::cin >> a;
std::cout << solve(n, m, a) << std::endl;
}
return 0;
}
1.5 rules 洛谷 - B4012
这道题的重点在于统计出每一天遵守规则k的人数,以及是否有一半的天数都有每天有一半以上的人遵守规则k。这边注意的是一半不能用int类型,会吃掉所有的小数点的数字,造成误差,代码如下
#include <stdio.h>
int main()
{
int i, j, t, k, n, x, a, b;
int cnt2 = 0;
scanf("%d %d %d", &n, &t, &k);
a =( n +1) / 2;
b =( t +1) / 2;
for (i = 1; i <= t; i++)
{
int cnt1 = 0;
for (j = 1; j <= n; j++)
{
scanf("%d", &x);
if (x == k)
cnt1++;
}
if (cnt1 >= a)
{
cnt2++;
}
}
if (cnt2 >= b)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}