CodeForces - 1384

CodeForces - 1384

A - Common Prefixes GNU

前缀取相同,后面的不同的字母向后移一位

char ans[maxn][60];
int t,n,a[maxn];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        rep(i,1,n)scanf("%d",&a[i]);
        rep(i,1,50)ans[1][i]='a';
        rep(i,2,n+1)
        {
            rep(j,1,a[i-1])ans[i][j]=ans[i-1][j];
            rep(j,a[i-1]+1,50)ans[i][j]=(ans[i-1][a[i-1]+1]-'a'+1)%26+'a';
        }
        rep(i,1,n+1)
        {
            rep(j,1,50)printf("%c",ans[i][j]);
            puts("");
        }
    }
    return 0;
}



B2 - Koa and the Beach (Hard Version)

h表示当前的高度,f表示h下一步将要-1还是+1

int n,t,a[maxn],k,l,h,f;
bool solve()
{
    int h=k+1,f=-1;
    rep(i,1,n)
    {
        if (a[i]<0)return false;//怎么样都会淹死
        else if (a[i]>=k)//怎么样都不会被淹死,取最优状态,即下降的那半段的开头
        {
            h=k+1;
            f=-1;
        }
        else if (f==-1)h=min(h-1,a[i]);//模拟下降的那半段
        else//模拟上升的那半段
        {
            h++;
            if (h>a[i])return false;
        }//下降的那半段到头了就切换为上升
        if (h==0)f=1;
    }
    return true;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&k,&l);
        rep(i,1,n)scanf("%d",&a[i]),a[i]=l-a[i];
        if (solve())printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}



C - String Transformation 1

直接模拟
S[x-'a'].insert(y-'a')表示x需要转化为y

abb
bcd
a要变成b,b要变成c,b要变成d

对a进行操作后:
bbb
bcd
b要变成c,b要变为d

对b进行第一次操作后:
bcc
bcd
变为:c要变为d

对b进行第二次操作后:
bcd
bcd


char s1[maxn],s2[maxn];
int t,n;
set<int> S[30];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        rep(i,0,28)S[i].clear();
        bool mark=true;
        int ans=0;
        scanf("%d",&n);
        scanf("%s",s1);
        scanf("%s",s2);
        rep(i,0,n-1)
        {
            if (s1[i]==s2[i])continue;
            else if (s1[i]>s2[i])mark=false;
            else if (S[s1[i]-'a'].find(s2[i]-'a')==S[s1[i]-'a'].end())S[s1[i]-'a'].insert(s2[i]-'a');
        }
        rep(i,0,25)
        {
            if (S[i].size()==0)continue;
            set<int>:: iterator it;
            ans++;
            int x=*S[i].begin();
            for (it=S[i].begin();it!=S[i].end();it++)
            {
                if (it==S[i].begin())continue;
                if (S[x].find(*it)==S[x].end())S[x].insert(*it);
            }
        }
        if (!mark)W(-1);
        else W(ans);
    }
    return 0;
}



D - GameGame

摘自:https://blog.csdn.net/C_Dreamy/article/details/107576085?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159724017219724848303834%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159724017219724848303834&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v3~pc_rank_v2-2-107576085.first_rank_ecpm_v3_pc_rank_v2&utm_term=++Codeforces+Round+%23659+%28Div.+&spm=1018.2118.3001.4187
根据异或的性质,统计所有位上的数字

a 表示当前位上 1 的个数,b 表示当前位上 0 的个数

如果 a 是偶数,无论 b ,这一位上都相同

如果 a 是奇数,

Koa 先拿,现在有 a-11,为偶数,很容易想到剩余的 1 该如何分

若 均分后每个人再分偶数个 即 (a-1)%4=0,也就是说每个人再分到偶数个 1,那么无论 b, Koa 赢
若 均分后每个人再分奇数个 即 (a-1)%4=2,那么决定权再对手手里,即通过拿 0 使得 Koa 再拿奇数个 1
如果 0 有偶数个,那么 Koa 一定会拿到奇数个 1,一定输
如果 0 有奇数个,那么 Koa 通过多拿一个 0 少拿一个 1,使得对手多拿一个 1 ,从而获得胜利

int num1[maxn],num0[maxn],t,n,x;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        int ans=0;
        mem(num1,0);
        scanf("%d",&n);
        rep(i,1,n)
        {
            scanf("%d",&x);
            repp(j,0,30)if (x&(1<<j))num1[j]++;
        }
        for (int i=29;i>=0;i--)
        {
            num0[i]=n-num1[i];
            if (num1[i]%2==1)
            {
                if (num1[i]%4==1)ans=1;
                else if (num1[i]%4==3&&num0[i]%2==0)ans=2;
                else if (num1[i]%4==3&&num1[i]%2==1)ans=1;
                break;
            }
        }
        if (ans==1)printf("WIN\n");
        else if (ans==2)printf("LOSE\n");
        else printf("DRAW\n");
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CodeForces - 616D是一个关于找到一个序列中最长的第k好子段的起始位置和结束位置的问题。给定一个长度为n的序列和一个整数k,需要找到一个子段,该子段中不超过k个不同的数字。题目要求输出这个序列最长的第k好子段的起始位置和终止位置。 解决这个问题的方法有两种。第一种方法是使用尺取算法,通过维护一个滑动窗口来记录\[l,r\]中不同数的个数。每次如果这个数小于k,就将r向右移动一位;如果已经大于k,则将l向右移动一位,直到个数不大于k。每次更新完r之后,判断r-l+1是否比已有答案更优来更新答案。这种方法的时间复杂度为O(n)。 第二种方法是使用枚举r和双指针的方法。通过维护一个最小的l,满足\[l,r\]最多只有k种数。使用一个map来判断数的种类。遍历序列,如果当前数字在map中不存在,则将种类数sum加一;如果sum大于k,则将l向右移动一位,直到sum不大于k。每次更新完r之后,判断i-l+1是否大于等于y-x+1来更新答案。这种方法的时间复杂度为O(n)。 以上是两种解决CodeForces - 616D问题的方法。具体的代码实现可以参考引用\[1\]和引用\[2\]中的代码。 #### 引用[.reference_title] - *1* [CodeForces 616 D. Longest k-Good Segment(尺取)](https://blog.csdn.net/V5ZSQ/article/details/50750827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Codeforces616 D. Longest k-Good Segment(双指针+map)](https://blog.csdn.net/weixin_44178736/article/details/114328999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值