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):

Gym - 100947F

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;
  }

  

posted @ 2017-02-14 18:08  ost_xg  阅读(384)  评论(0编辑  收藏  举报