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

本文解析了四道编程挑战题目,包括字符串开头判断、矩阵颜色反转操作、矩阵回文构造及多色矩阵设计,提供了完整的代码实现及解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

第一题:给定字符串,判断开头是否“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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值