A (By ggg):
题意:一个人还有x秒到红绿灯,这个红绿灯有g秒绿灯,y秒黄
灯,r秒红灯,问你到红绿灯的时候是什么灯。值得注意的是绿
灯变黄灯时,第g秒是黄灯了。
B (By Anxdada):
Gym - 100947B
C(By Kresnt):
显然,当 n 时偶数的时候,只有 2 种取法(取下标为奇数的,或是取下标为偶数的)
当 n 为奇数时,按照隔一取一的方式遍历序列
Seq A:1 5 3 2 4
遍历为 Seq B:1 3 4 5 2
然后问题就变成了从 *B* 序列中取 *连续的* n/2+n&1 个数
开一个前缀和sum[] 就解决啦
D (By ggg) :
题意:给你一个n,要你输出三个数,相互给予后都能成为n,每次给予的数的大小是被给予的数的大小。数学思维题,直接贴代码感受
void solve() {
int n; scanf("%d", &n);
if (n%8!=0) puts("Impossible");
else {
printf("%d %d %d\n", n/8*11, n/8*7, n/8*6);
}
}
int main() {
int t = 1;
scanf("%d", &t);
while(t--)
solve();
return 0;
}
E(By):
F(By pipixia):
G(By Cyril1317):
Gym - 100947G Square Spiral Search
H(By Cyril1317):
Gym - 100947H Phobia
I(By xgg):
gym 100947I (求因子)
J(By):
K(By Kresnt):
这是一道模拟题
(0,0)
–> 右移
{
–> 向左下角移
–> 到边界,
1)左边界的话向下
2) 下边界的话向右
–> 向右上移
}
summarize 一下,发现 “{” “}”内的是重复的,故写成循环就好了
然后发现第一步右移到了右上角是有问题的,就改成
1)在上边界的话右移
2)在右边界的话下移
以
while(true){
ans.push_back(mp[x][y]);
if(y < n-1) y++;
else x++;
while(y > 0 && x < n-1)
ans.push_back(mp[x++][y--]);
ans.push_back(mp[x][y]);
if(x < n-1) x++;
else y++;
while(y < n-1 && x > 0)
ans.push_back(mp[x--][y++]);
if(x == n-1 && y == n-1) break;
}