Codeforces Round #531 (Div. 3)

https://codeforces.com/contest/1102/problem/A

題意:給定一個數n,將1-n分成兩組,使得兩組數的差值最小,輸出最小差值。

思路:根據推理髮現,隨着n的增大,是有規律出現的,跟4的倍數有關係。

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
#define ll long long
int main()
{
    ll n;
    while(scanf("%lld",&n)!=EOF)
    {
            if(n%4==0)
                cout<<0<<endl;
            else if(n%4==1)
                cout<<1<<endl;
            else if(n%4==2)
                cout<<1<<endl;
            else if(n%4==3)
                cout<<0<<endl;

    }

    return 0;
}

https://codeforces.com/contest/1102/problem/B

題意:給定n個數和k種顏色,要求這n個數字中相等的應該用不同的顏色塗色,並且這k種顏色都應該使用,所以只需要兩次排序,第一次將這n個數從此小到大排序,然後將這k個數分別取餘放上,之後再將這n個數,按照輸入的順序排序在輸出顏色的排布。

#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 400+100;
struct node
{
    int x,pos,ks;
}pp[100005];
bool cmp2(node a,node b)
{
    return a.x<b.x;
}
bool cmp1(node a,node b)
{
    return a.pos<b.pos;
}
int main()
{
    int n,k;
    int vis[100005];
    while(scanf("%d %d",&n,&k)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        int maxx=-inf;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&pp[i].x);
            vis[pp[i].x]++;
            maxx=max(maxx,pp[i].x);
            pp[i].pos=i;
        }
        sort(pp,pp+n,cmp2);
       /* for(int i=0;i<n;i++)
        {
            printf("%d ",pp[i].x);
        }*/
        if(n<k)
        {
            printf("NO\n");
            return 0;
        }
        for(int i=1;i<=maxx;i++)
        {
            if(vis[i]>k)
            {
                printf("NO\n");
                return 0;
            }
        }
        int cur=1;
        for(int i=0;i<n;i++)
        {
         //   printf("%d ",cur);
            if(cur%k==0)
                pp[i].ks=k;
            else
                pp[i].ks=cur%k;
            cur++;
        }
        sort(pp,pp+n,cmp1);
     /* for(int i=0;i<n;i++)
      {
          printf("%d ",pp[i].pos);
      }*/
        printf("YES\n");
        for(int i=0;i<n;i++)
        {
            if(i==0)
                printf("%d",pp[i].ks);
            else
                printf(" %d",pp[i].ks);
        }
        printf("\n");
    }

    return 0;
}

https://codeforces.com/contest/1102/problem/C

題意:有n扇門,每扇門有一定的防禦值,其中一個人有x的攻擊力,另一個人有y的修復力,請問,x最多可以破壞幾扇門。

思路:如果說,x的破壞力大於y那麼他將破壞所有的門,但是如果,x<y 那麼尋找防禦值小於x的破壞,然後就能推出公式 

#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 400+100;
int main()
{
    int n,x,y;
    while(scanf("%d %d %d",&n,&x,&y)!=EOF)
    {
        int ans=0;
        for(int i=0;i<n;i++)
        {
            int cur;
            scanf("%d",&cur);
            if(cur<=x)
                ans++;
        }
        if(x>y)
            printf("%d\n",n);
        else
        {
            ans++;
            ans/=2;
            printf("%d\n",ans);
        }
    }

    return 0;
}

https://codeforces.com/contest/1102/problem/D

題意:給定n個數由012三個數字組成,現在要求用最少的次數,使這三種數字的數量相等,而且必須滿足字典序最小。

思路:先統計一下012分別出現的個數,然後從前往後,從後往前分別掃一遍

#include<bits/stdc++.h>
#include<iostream>
#define ll long long
using namespace std;

int main()
{
    int n;
    string ch;
    int vis[10];
    while(scanf("%d",&n)!=EOF)
    {
        cin>>ch;
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            vis[ch[i]-'0']++;
        }
        for(int i=0;i<n;i++)
        {
            if(vis[0]<n/3&&vis[ch[i]-'0']>n/3&&ch[i]!='0')vis[0]++,vis[ch[i]-'0']--,ch[i]='0';
            if(vis[1]<n/3&&vis[ch[i]-'0']>n/3&&ch[i]=='2')vis[1]++,vis[2]--,ch[i]='1';
        }
        for(int i=n-1;i>=0;i--)
        {
            if(vis[2]<n/3&&vis[ch[i]-'0']>n/3&&ch[i]!='2')vis[2]++,vis[ch[i]-'0']--,ch[i]='2';
            if(vis[1]<n/3&&vis[ch[i]-'0']>n/3&&ch[i]=='0')vis[1]++,vis[ch[i]-'0']--,ch[i]='1';
        }
       cout<<ch<<endl;
    }


    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章