2015 AlBaath Collegiate Programming Contest(2月14日训练赛)
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; }