[BestCoder] Round #36

本文解析了三个ACM编程竞赛题目:验证字符串是否能被均匀分为三组不同字符的组合,统计特定高度的树数量,以及离线处理树种植与查询问题。提供了完整的代码实现,并附带了解题思路。

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

题目地址 http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=574

1001

首先判断长度能不能被3整除,然后字符串分成三段看每段的字母是否相同,再判断一下三段的字符是否各不相同。

#define rd(x) scanf("%d",&x)
#define rd2(x,y)  scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef long long ll;

string str;

int main()
{
    while(cin>>str)
    {
        int len=str.length();
        bool ok=1;
        if(len<3||len%3!=0)
        {
            ok=0;
            cout<<"NO"<<endl;
            continue;
        }
        int ge=len/3;
        char a,b,c;
        a=str[0];
        b=str[ge];
        c=str[2*ge];
        for(int i=1;i<ge;i++)
        {
            if(str[i]!=str[i-1])
            {
                ok=0;
            }
        }
        for(int i=ge+1;i<2*ge;i++)
        {
            if(str[i]!=str[i-1])
                ok=0;
        }
        for(int i=2*ge+1;i<3*ge;i++)
            if(str[i]!=str[i-1])
            ok=0;
        if(ok&&a!=b&&a!=c&&b!=c)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

1002

用map<int,int>保存高度为H的树有多少个,然后对应输出就可以了,注意每次输出后该高度的树数目清0.

输入用到了快速读入。

#define rd(x) scanf("%d",&x)
#define rd2(x,y)  scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef long long ll;

const int maxn=1000100;
map<int,int>mp;


inline int read()
{
    char ch=getchar();int x=0,f=1;
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}


int n,m;
int main()
{
    while(rd2(n,m)!=EOF)
    {
        mp.clear();
        int x;
        for(int i=1;i<=n;i++)
        {
            x=read();
            mp[x]++;
        }
        for(int i=1;i<=m;i++)
        {
            x=read();
            printf("%d\n",mp[x]);
            mp[x]=0;
        }
    }
    return 0;
}

1003

根据大神的思路写的,离线,首先把树按高度从大到小排好序,然后把查询按查询的高度从大到小排序,然后对于每次查询,从大到小去种树,因为前面已经排好序了,所以遍历就可以了,每次查询只要树的高度大于查询的高度就一直种树,初始块为0,当种第i棵树时,如果它的两边都为空,那么块+1,如果它的两边都不空,那么块-1.思路膜拜。

#define rd(x) scanf("%d",&x)
#define rd2(x,y)  scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef long long ll;

const int maxn=50010;

struct query
{
    int id;
    int ans;
    int q;
}Q[maxn];

struct Tree
{
    int id;
    int high;
}tree[maxn];

bool cmp1(Tree a,Tree b)
{
    if(a.high>b.high)
        return true;
    return false;
}

bool cmp2(query a ,query b)
{
    if(a.q>b.q)
        return true;
    return false;
}
int n,q;
bool has[maxn];

bool cmp3(query a,query b)
{
    if(a.id<b.id)
        return true;
    return false;
}

int main()
{
    while(rd2(n,q)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            rd(tree[i].high);
            tree[i].id=i;
        }
        sort(tree+1,tree+1+n,cmp1);
        memset(has,0,sizeof(has));
        for(int i=0;i<q;i++)
        {
            Q[i].id=i;
            rd(Q[i].q);
        }
        sort(Q,Q+q,cmp2);
        int cnt=0;
        int r=1;
        for(int i=0;i<q;i++)
        {
            if(i>0&&Q[i].q==Q[i-1].q)
            {
                Q[i].ans=Q[i-1].ans;
                continue;
            }
            while(tree[r].high>Q[i].q&&r<=n)
            {
                if(!has[tree[r].id-1]&&!has[tree[r].id+1])
                {
                    cnt++;
                    has[tree[r].id]=1;
                }
                if(has[tree[r].id-1]&&has[tree[r].id+1])
                {
                    has[tree[r].id]=1;
                    cnt--;
                }
                has[tree[r].id]=1;
                r++;
            }
            Q[i].ans=cnt;
        }
        sort(Q,Q+q,cmp3);
        for(int i=0;i<q;i++)
        {
            printf("%d\n",Q[i].ans);
        }
    }
    return 0;
}



 

关于 KFCOI Round #1 的具体资料并未在提供的引用中提及。然而,可以根据 Codeforces 类型的比赛结构以及类似的竞赛经验来推测可能的内容。 ### 参与 KFCOI Round #1 的相关信息 通常情况下,在线编程比赛(如 KFCOI 或 Codeforces)会提供以下资源供参赛者回顾: #### 1. **题目集** 比赛结束后,官方一般会在其官方网站或相关平台上发布完整的题目集合。这些题目可能会附带样例输入输出以便于理解问题的要求[^1]。 #### 2. **题解与思路分析** 官方或者社区成员往往会撰写详细的题解文档,帮助未通过某些难题的选手学习新的算法技巧。例如,在 Codeforces 中,像 A 到 D 题这样的解析是非常常见的。 #### 3. **比赛数据统计** 统计信息包括但不限于每位选手提交次数、正确率等指标。这类数据分析有助于评估个人表现并与他人对比进步空间[^3]。 #### 4. **赛后讨论论坛** 很多平台都设有专门区域让参与者自由交流想法甚至分享错误经历以互相借鉴成长。比如提到过的多次尝试不同方法解决同一道简单题目的过程就是很好的例子。 ### 如何获取上述材料? - 如果您已经注册参加了该赛事,则可以直接登录账户查看存档页面; - 对于公开可用的部分链接地址可以通过搜索引擎查询关键词“KFCOI Round #1 review”找到相关内容; - 加入一些活跃的技术社群也可能获得更多一手资讯和支持。 以下是基于假设场景下的 Python 实现示例用于处理类似 CF 圆整数分解成最小数量正整数组合的问题: ```python def min_sum_representation(n): result = "" current_value = n for digit in range(9, 0, -1): while current_value >= digit: result += str(digit) current_value -= digit return &#39;&#39;.join(sorted(result)) print(min_sum_representation(7)) # 输出:"7" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值