• Codeforces Round #640 (Div. 4)


    原题链接

    因为太菜了只能写写水题

    A. Sum of Round Numbers

    题意:

    把每位的数都分出来,比如9876就分成9000,800,70,6

    思路:

    不要求顺序的,所以可以直接用vector存一下非零位,输出即可。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    deque<ll>q;
    int main(){
    	vector<int>v;
    	int t;cin>>t;
    	while(t--){
            v.clear();
            ll res=1;
            ll n;cin>>n;
            while(n){
                if(n%10)
                    v.push_back((n%10)*res);
                n/=10;
                res*=10;
            }
            cout<<v.size()<<endl;
            for(auto tt:v){
                cout<<tt<<" ";
            }
            puts("");
    	}
    	return 0;
    }
    
    

    B. Same Parity Summands

    题意:

    问一个数n能否分成k个大于0的奇数或k个大于0的偶数

    思路:

    考虑特殊性。

    如果能分成k个大于0的奇数的话,一定能够分出(k-1)个1并且剩下的数一定大于0且是奇数。

    偶数也同理。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    
    int main(){
    	int t;cin>>t;
    	while(t--){
            ll n,k;
            cin>>n>>k;
            bool flag=0;
            ll tmpn=n;
            if((tmpn-(k-1))>0&&(tmpn-(k-1))%2){
                flag=1;
                puts("yes");
                for(int i=1;i<k;i++) cout<<"1 ";
                cout<<tmpn-(k-1)<<endl;
                continue;
            }
            if((tmpn-2*(k-1))%2==0&&(tmpn-2*(k-1))>0){
                flag=1;
                puts("yes");
                for(int i=1;i<k;i++) cout<<"2 ";
                cout<<tmpn-2*(k-1)<<endl;
                continue;
            }
            if(!flag) puts("no");
    	}
    	return 0;
    }
    

    C. K-th Not Divisible by n

    题意:

    找不能整除n的第k个数

    思路:

    可以以整除n作为一个标志,这样所有的数就会被分成若干个循环节。

    只需要判断k位于第几个循环节的第几位即可。

    要注意特判,样例过了就可以AC了

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    int main(){
    	int t;cin>>t;
    	while(t--){
            ll n,k;
            cin>>n>>k;
            ///不能整除n的第k个数
            ll cnt=k/(n-1)+1;///第几组
            ll pos=k%(n-1);
           /// cout<<cnt<<" "<<pos<<endl;
            ll sum=n*(cnt-1);
            if(pos==0) pos=-1;
            cout<<sum+pos<<endl;
    	}
    	return 0;
    }
    

    D. Alice, Bob and Candies

    题意:

    A从左边取,B从右边取,要求每个人取的数量都必须比另一个人上一次取的数量多或是都取完。

    求两个人总的取的次数,以及他们得到的值。

    思路:

    deque啊!

    多好用,直接模拟

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    deque<ll>q;
    int main(){
    	///操作次数 suma sumb
    	int t;cin>>t;
    	while(t--){
            ll n;cin>>n;
            q.clear();
            for(int i=1;i<=n;i++){
                int x;cin>>x;
                q.push_back(x);
            }
            ll suma=0,sumb=0,lasta=0,lastb=0;
            ll cnt=0;
            while(!q.empty()){
                ll now=0;
                while(now<=lastb&&!q.empty()){
                    now+=q.front();
                    q.pop_front();
                }
                suma+=now;cnt++;lasta=now;now=0;
                if(q.empty()) break;
                while(now<=lasta&&!q.empty()){
                    now+=q.back();
                    q.pop_back();
                }
                sumb+=now;cnt++;lastb=now;now=0;
            }
            cout<<cnt<<" "<<suma<<" "<<sumb<<endl;
    	}
    	return 0;
    }
    

    EFG

    E n^2能过是没想到的……

  • 相关阅读:
    移动端rem布局
    父子组件通信
    拦截器
    Vue路由教程
    使用var和let的区别
    数组去重的几种方法
    利用位运算进行权限控制
    线程基础
    关于get请求的乱码问题
    nuxt.js Navigating to current location ("/xxx") is not allowed
  • 原文地址:https://www.cnblogs.com/OvOq/p/14853142.html
Copyright © 2020-2023  润新知