Codeforces Round #640 (Div. 4)(ABCDEG题解)

A. Sum of Round Numbers

题解:把他一个整数拆分,模拟一波即可

    #pragma GCC optimize(3,"Ofast","inline")
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <math.h>
    #include <string>
    #include <list>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <algorithm>
    #include <stdlib.h>
    #include <vector>
    #define maxn 200010
    const int MaxN = 0x3f3f3f3f;
    const int MinN = 0xc0c0c00c;
    typedef long long ll;
    const int mod = 1000007;
    using namespace std;
    int a[10];
    int main()
    {
        int t;
        cin>>t;
        while(t--){
            int n;
            cin>>n;
            int cnt=0;
            int ans=1;
            while(n){
                if(n%10!=0){
                    a[cnt++]=(n%10)*ans;
                    //cout<<"debug: "<<a[cnt-1]<<endl;
                }
                ans*=10;
                n/=10;
            }
            cout<<cnt<<endl;
            for(int i=0;i<cnt;i++){
                cout<<a[i]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }

B - Same Parity Summands

题解:我们可以先假设全都用奇数表示出来,只需要将前k-1项为1(最小的奇数),在判断最后一项是否为奇数,再假设可以用偶数表示,如果前k-1项都可以用偶数表示2(最小得偶数即可),在判断最后一项是否为奇数

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 200010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[10];
int main()
{
    int t;
    cin>>t;
    while(t--){
        int n,k;
        cin>>n>>k;
        if((n-k+1)%2==1&&(n-k+1)>0){
            printf("YES\n");
            for(int i=0;i<k-1;i++){
                printf("1 ");
            }
            printf("%d\n",n-k+1);
            continue;
        }
        else if((n-2*(k-1))%2==0&&(n-2*(k-1))>0){
            printf("YES\n");
            for(int i=0;i<k-1;i++){
                printf("2 ");
            }
            printf("%d\n",n-2*(k-1));
            continue;
        }
        printf("NO\n");
    }
    return 0;
}

C - K-th Not Divisible by n

题解:把n和n的倍数抠出来再找k即可

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 200010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[10];
int main()
{
    int t;
    cin>>t;
    while(t--){
        ll n,k;
        cin>>n>>k;
        ll ans=k/(n-1);
        ll temp=ans*n+k%(n-1);
        if(k%(n-1)==0) temp--;
        cout<<temp<<endl;
    }
    return 0;
}

D - Alice, Bob and Candies

题解:模拟题
双指针往中间夹,注意处理一下细节即可

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 8010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[maxn];

int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        int l=1,r=n+1;
        int ans1=0,ans2=0,cnt=1,x=a[1],y=0;
        bool flag=false;
        ans1=a[1];
        while(l+1!=r){
            if(flag){
                cnt++,x=0;
                while(x<=y){
                    if(l+1==r){
                        break;
                    }
                    x+=a[++l];
                }
                ans1+=x;
                flag=false;
            }
            else{
                cnt++,y=0;
                while(y<=x){
                    if(l+1==r){
                        break;
                    }
                    y+=a[--r];
                }
                ans2+=y;
                flag=true;
            }
        }
        cout<<cnt<<" "<<ans1<<" "<<ans2<<endl;
    }
}


E - Special Elements

题解:我们可以对于每个数双指针操作
复杂度n2,不过没超时

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 8010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[maxn];

int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        int cnt=0;
        for(int i=0;i<n;i++){
            int l=0,r=0;
            ll ans=a[0];
            while(r<n){
                if(a[i]==ans&&l-r!=0){
                    cnt++;
                    break;
                }
                else if(a[i]<ans){
                    ans-=a[l];
                    l++;
                }
                else{
                    r++;
                    ans+=a[r];
                }
                //cout<<l<<" "<<r<<endl;
            }
        }
        printf("%d\n",cnt);

    }
    return 0;
}

F. Binary String Reconstruction

时间有限,大一刚入坑菜鸡,没写完

G - Special Permutation

题解:感觉应该会其他做法,这题让我硬生生写出了模拟的味道,感觉是找规律+模拟

首先你可以发现长度为2或者是3的数组是不可以的(直接pass掉)

  1. 最小长度为4即可,当然4的倍数长度的数组也是可以的
  2. 然后再看n%4=1的时候,那么n-5一定就是4的倍数,这样前n-5项按照4的倍数进行处理,最后五项自己找一下排序规则
  3. 然后再看n%4=2的时候,那么n-6一定就是4的倍数,这样前n-6项按照4的倍数进行处理,最后六项自己找一下排序规则
  4. 然后再看n%4=3的时候,那么n-7一定就是4的倍数,这样前n-7项按照4的倍数进行处理,最后七项自己找一下排序规则

怎么讲其按照自己预定的顺序输出呢?可以设置一个顺序数组即可

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 200010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[maxn];
int x[10]={2,4,1,3};
int y[10]={1,3,5,2,4};
int z[10]={1,3,5,2,4,6};
int h[10]={1,4,7,3,5,2,6};
int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) a[i]=i;
        if(n==2||n==3){
            printf("-1\n");
            continue;
        }

        if(n%4==0){  //0
            for(int i=0;i<n;i++){
                int f=i%4;
                printf("%d ",a[x[f]+i-f]);
            }
            printf("\n");
        }
        else if(n%4==1){   //1
            for(int i=0;i<n-5;i++){
                int f=i%4;
                printf("%d ",a[x[f]+i-f]);
            }
            for(int i=0;i<5;i++){
                printf("%d ",a[y[i]+n-5]);
            }
            printf("\n");
        }

        else if(n%4==2){
            for(int i=0;i<n-6;i++){
                int f=i%4;
                printf("%d ",a[x[f]+i-f]);
            }
            for(int i=0;i<6;i++){
                printf("%d ",a[z[i]+n-6]);
            }
            printf("\n");
        }

        else if(n%4==3){
            for(int i=0;i<n-7;i++){
                int f=i%4;
                printf("%d ",a[x[f]+i-f]);
            }
            for(int i=0;i<7;i++){
                printf("%d ",a[h[i]+n-7]);
            }
            printf("\n");
        }
    }
    return 0;
}

题解 文章被收录于专栏

主要写一些题目的题解

全部评论

相关推荐

joe2333:怀念以前大家拿华为当保底的日子
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务