A.字符统计
题解:模拟。比赛的时候在思考怎么输出最后一个样例,结果发现比赛上面自测能输出,应该是遇到‘\0’结束。然后注意下didn’t是一个单词,根据空格统计单词,而且输入字符串应当合法。
#include
#include
char s[1100];
int main()
{
int t;scanf("%d", &t);
getchar();
while (t--){
int line = 0, word = 0, ch = 0;
while (gets(s) && strcmp(s, "=====")){
int l = strlen(s), ok = 0;
line++, ch += l;
for (int i = 1; i < l; i++){
if (s[i] == ' ' && s[i - 1] != ' ') ok = 1, word++;
}
if (ok) word++;//最后一个空格后面有单词
}
printf("%d %d %d\n", line, word, ch);
}
}
B.连分数
题解:思维。类似于辗转相除法,除数作被除数,余数作除数。
#include
using namespace std;
int main()
{
int t;scanf("%d", &t);
while (t--){
int a, b;scanf("%d%d", &a, &b);
printf("%d/%d = ", a, b);
if (a % b == 0){
printf("%d\n", a / b);
continue;
}
int cnt = 0;
while (a % b){
cnt++;
printf("%d", a / b);
int num1 = b, num2 = a % b;
a = num1, b = num2;
if (a % b == 0){
printf("+1/%d", a / b);
for (int i = 1; i < cnt; i++)
printf("}");//‘}’对应‘{’的数量
printf("\n");
break;
}
else printf("+1/{");
}
}
}
D.购物
题解:模拟。
#include
using namespace std;
struct node
{
char str[150];
int num;
}k[110];
int main()
{
int t;scanf("%d", &t);
while (t--){
int s, n;scanf("%d%d", &s, &n);
for (int i = 0; i < s; i++)
scanf("%s%d", k[i].str, &k[i].num);
while (n--){
map<string, int>mp;
int a;char b[150];
scanf("%d", &a);
while (a--){
scanf("%s", b);
mp[b] = 1;
}
for (int i = 0; i < s; i++)
if (!mp[k[i].str] && k[i].num > 0) k[i].num--;
}
int res = 0;
for (int i = 0; i < s; i++)
if (k[i].num) res++;
if (!res) printf("Need to be lucky\n");
else printf("%d\n", res);
}
}
E.喝可乐
题解:枚举。数据小,枚举蜂蜜和生姜可乐的数量。
#include
using namespace std;
int main()
{
int t;scanf("%d", &t);
while (t--){
int n, a, b;scanf("%d%d%d", &n, &a, &b);
int maxn = 0;
for (int i = 0; i <= n; i++){
int na = i, nb = n - i;
int num = n;
while (na >= a || nb >= b){
nb += na / a, num += na / a, na %= a;
na += nb / b, num += nb / b, nb %= b;
}
maxn = max(maxn, num);
}
printf("%d\n", maxn);
}
}
F.天旋地转
题解:模拟。写出四个方向对应的移动方式。这里r是逆时针,l是顺时针。
#include
using namespace std;
int main()
{
int t;scanf("%d", &t);
while (t--){
int n;scanf("%d", &n);
int p = 0;
long long x = 0, y = 0;
while (n--){
char s;int k;
cin >> s >> k;
if (s == 'r'){
p -= k;
while (p < 0) p += 4;
continue;
}
if (s == 'l'){
p += k;
if (p >= 4) p %= 4;
continue;
}
if (!p){
if (s == 'w') y += k;
else if (s == 's') y -= k;
else if (s == 'a') x -= k;
else x += k;
}
else if (p == 1){
if (s == 'w') x += k;
else if (s == 's') x -= k;
else if (s == 'a') y += k;
else y -= k;
}
else if (p == 2){
if (s == 'w') y -= k;
else if (s == 's') y += k;
else if (s == 'a') x += k;
else x -= k;
}
else{
if (s == 'w') x -= k;
else if (s == 's') x += k;
else if (s == 'a') y -= k;
else y += k;
}
//printf("%d %d\n", x, y);
}
printf("%lld %lld\n", x, y);
}
}
I.三角尼姆
题解:1.打表。和为奇,Alice赢;和为偶,Bob赢。
n<=2,每人每次只能放一个,都是A赢;n=3,考虑最优解,每人每次拿的球应当尽可能的多,那么另外一个人拿到最后一个球的可能性就越大,此时B先拿最底下三个必赢;n=4,同理B拿最底下三个必赢。通过观察不难发现与和有关。
2.思维。每人每次拿一个或三个,那么一轮就拿偶数个。所以,如果和为偶数,恰好轮到A,A拿完最后一个球,A输;如果和为奇数,B多拿一次,B拿完最后一个球,B输。
#include
using namespace std;
int main()
{
int t;scanf("%d", &t);
while (t--){
int n;scanf("%d", &n);
int sum = (n + 1) * n / 2;
if (sum % 2) printf("Alice\n");
else printf("Bob\n");
}
}