A - Solving Order
题意:
给你一些二元组,每个二元组的第一项是字符串,第二项是数字。请你按照数字从大到小的顺序将这些二元组排序,并依次输出第一项。
解法:
写成结构体,重载小于号,调用STL函数即可。
参考代码:
#include <cstdio>
#include <algorithm>
const int MAXN = 10 + 10;
struct Balloon{
char col[10];
int num;
bool operator < (const Balloon &oth)const{
return num > oth.num;
}
}balloon[MAXN];
int main(){
int t;
scanf("%d", &t);
while (t--){
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%s %d", balloon[i].col, &balloon[i].num);
std::sort(balloon, balloon + n);
for (int i = 0; i < n; ++i){
printf("%s", balloon[i].col);
printf("%s", i == n-1? "\n" : " ");
}
}
return 0;
}
B - Desert
C - Luck Competition
题意:
给你
n
−
1
n-1
n−1 个数字,请你再给出一个数,使得你给出的数字最接近(且不大于)所有数的算术平均值的三分之二。最后输出所有数字中与你所选数字相等的数的个数的倒数。
解法:
解一个方程,你所选的数字应该是
⌊
2
sum
/
(
3
n
−
2
)
⌋
\lfloor 2\text{sum}/(3n-2) \rfloor
⌊2sum/(3n−2)⌋ ,其中
sum
\text{sum}
sum 表示给你的数字之和。然后统计出现个数再输出倒数即可。
参考代码:
#include <cstdio>
#include <algorithm>
const int MAXN = 100 + 10;
int a[MAXN];
int main(){
int t;
scanf("%d", &t);
while (t--){
int n;
scanf("%d", &n);
int sum = 0;
for (int i = 1; i < n; ++i){
scanf("%d", &a[i]);
sum += a[i];
}
int res = (sum << 1) / (3 * n - 2);
int prob = 1;
for (int i = 1; i < n; ++i)
if (a[i] == res) prob++;
printf("%d %.2lf\n", res, 1.0 / prob);
}
return 0;
}
D - Clock
E - GirlCat
题意:
给你一个
n
×
m
n\times m
n×m 大小的字符串矩阵,请你在其中分别找出单词 “girl” 和 “cat” 出现的个数。
如果从一个字母出发向上下左右寻找,能依次连续地找到字母拼成那个单词就算作那个单词出现了。
解法:
遍历矩阵,先找到单词的首字母,然后深搜。
参考代码:
#include <cstdio>
#include <cstring>
const int MAXN = 1e3+10;
char maze[MAXN][MAXN];
bool vis[MAXN][MAXN];
int movx[] = {-1,1,0,0};
int movy[] = {0,0,-1,1};
int n, m;
bool legal(int x,int y){
return x >= 0 && x < n && y >= 0 && y < m && !vis[x][y];
}
int dfs(int x, int y, char str[], int len, int idx){
if (idx == len - 1) return 1;
int ans = 0;
for (int i = 0; i < 4; ++i){
int xx = x + movx[i];
int yy = y + movy[i];
if (!legal(xx,yy)) continue;
if (maze[xx][yy] != str[idx + 1]) continue;
vis[xx][yy] = true;
ans += dfs(xx, yy, str, len, idx + 1);
vis[xx][yy] = false;
}
return ans;
}
int check(char str[], int len){
memset(vis, false, sizeof(vis));
int res = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (maze[i][j] == str[0])
res += dfs(i, j, str, len, 0);
return res;
}
int main(){
int t;
scanf("%d", &t);
while (t--){
scanf("%d %d", &n, &m);
for (int i = 0; i < n; ++i)
scanf("%s", maze[i]);
printf("%d %d\n", check("girl", 4), check("cat", 3));
}
}
F - Combine String
G - Alice and Bob
H - Claris Loves Painting
此题未AC。
题意:
给你一棵树,树上的结点存储着一些数字。现在对这棵树进行
m
m
m 次询问,每次读入两个数
x
x
x 和
d
d
d ,询问从结点
x
x
x 向下深度不超过
d
d
d 的子树中有多少个不同的结点。如果结点存储的数字不同则认为它们是不同的。
I - Digit-Sum
J - Ingress
题解来自队友星运里的错的博客,点此查看。