AGC CODE FESTIVAL 2017 qual A(部分题解)

来源:互联网 发布:喜欢安静的男生知乎 编辑:程序博客网 时间:2024/06/05 08:10

★传送门

第一题:给定字符串,判断开头是否“YAKI”

# include <iostream># include <cstdio>using namespace std;int main(){    string s;    cin >> s;    cout << (s.substr(0, 4) == "YAKI"?"Yes":"No") <<endl;    return 0;}

第二题:给定N*M的矩阵,初始全为白色,每次操作可以将某一行或者某一列的颜色反转,为是否能操作得到刚好有K个黑色。

  • 1N,M1000
  • 0KNM
思路:留意到每一行和每一列至多反转1次,因为对于某一行(列)翻了偶数次相当于没有翻,翻了奇数次相当于放了一次,那么我们枚举反转的行数和列数,判断是否等于K即可。

# include <iostream># include <cstdio>using namespace std;int main(){    int x, y, k;    scanf("%d%d%d",&x,&y,&k);    for(int i=0; i<=x; ++i)        for(int j=0; j<=y; ++j)        if(i*y+j*x-i*j*2 == k) return 0*puts("Yes");    puts("No");    return 0;}

第三题:给定N*M字母矩阵,问是否能通过任意改变字母的顺序,使得矩阵每一行每一列都是回文串。

  • 1H,W100
  • aij is a lowercase English letter.
思路:留意到四个角的字符一定是一样的,那么先判断奇数个的字母,若多于一种直接No,其余的若比4大,就放到四个角落,如果放完后还剩下2个,这两个字母就要占据中间行(列),最后判断中间的行(或列)够不够放就行。

# include <iostream># include <cstdio>using namespace std;int a[26];int main(){    char c;    int n, m, x=0, y=0, g=0, gg=0;    scanf("%d%d",&n,&m);    gg = (n/2)*(m/2);    for(int i=0; i<n; ++i)    {        getchar();        for(int j=0; j<m; ++j)        {            scanf("%c",&c);            ++a[c-'a'];        }    }    for(int i=0; i<26; ++i)    {        if(a[i]&1)        {            ++x;            --a[i];        }        int tmp = min(gg, a[i]/4);        gg -= tmp;        a[i] -= tmp*4;        if(a[i]) y+=a[i]/2;    }    if((!(n&1) && !(n&1) && x) || x > 1) return 0*puts("No");    if(n&1) g += m/2;    if(m&1) g += n/2;    if(y <= g) puts("Yes");    else puts("No");    return 0;}

第四题:给个矩阵上4种颜色,要求曼哈顿距离为D的点对颜色不一样,输出任意一个方案。

  • 2H,W500
  • 1dH+W2

应用了切比雪夫距离,一个N*N的格子里面切比雪夫距离<N,标程写的比较优雅,直接上标程了。

#include <iostream>using namespace std;int main() {    int H, W, d;    cin >> H >> W >> d;    char color[2][2] = {{'R', 'G'}, {'B', 'Y'}};    for (int i = 0; i < H; i++)    {        for (int j = 0; j < W; j++)        {            cout << color[(i+j)/d%2][(i-j+10000)/d%2];        }        cout << endl;    }    return 0;}