zoukankan      html  css  js  c++  java
  • Codeforces Round #640 (Div. 4) A->G

    地址:http://codeforces.com/contest/1352

      

         题意:将给出的数拆成最少的d000,,,形式

        解析:拆的话,太麻烦,直接用string即可

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=1e4+10;
    int a[maxn];
    int nu[7]={10,100,1000,10000};
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            string s;
            cin>>s;
            int len=s.length();
            int tot=0;
            for(int i=0;i<len;i++)
            {
                if(s[i]!='0')
                    tot++;
            }
            cout<<tot<<endl;
            for(int i=0;i<len;i++)
            {
                if(s[i]!='0')
                {
                    cout<<s[i];
                    for(int j=i+1;j<len;j++)
                        cout<<'0';
                        cout<<" ";
                }
            }
            cout<<endl;
        }
    }

        题意:构造长度为k的序列,要求全体奇偶性相同而且和为n。不存在输出NO

         解析:分类讨论即可。全放1或全放2,再看差值奇偶性。k>n肯定是不可能构造出的。写的有点繁琐了......

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=1e4+10;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n,k;
            cin>>n>>k;
            if(k>n)
            {
                cout<<"NO"<<endl;continue;
            }
            int ok1=0,ok2=0;
            if(k*1==n)
            {
                cout<<"YES"<<endl;
                for(int i=1;i<=k;i++)
                    cout<<"1"<<" ";
                    cout<<endl;
                    continue;
            }
            if(k*1<n)
            {
                int md=n-(k-1);
                if(md%2==0)
                {
                    ok1=1;
                }
                else
                {
                    cout<<"YES"<<endl;
                    for(int i=1;i<k;i++)
                        cout<<"1"<<" ";
                        cout<<md<<endl;
                        continue;
                }
            }
            if(k*2>n)
            {
                cout<<"NO"<<endl;continue;
            }
            if(k*2==n)
            {
                cout<<"YES"<<endl;
                for(int i=1;i<=k;i++)    
                    cout<<"2"<<" ";
                cout<<endl;
                continue;
            }
            if(k*2<n)
            {
                int md=n-(k-1)*2;
                if(md%2!=0)
                    ok2=1;
                else
                {
                    cout<<"YES"<<endl;
                    for(int i=1;i<k;i++)
                        cout<<"2"<<" ";
                    cout<<md<<endl;
                    continue;
                }
            }
            if(ok1&&ok2)
                cout<<"NO"<<endl;
        }
    }

         题意:无限长序列的数按不能被n整除排序,求第k个

         解析:看间距就可以了,没啥说的。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=1e9+10;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            ll n , k;
            cin>>n>>k;
            ll sum=0;
            if(k<n)
                cout<<k<<endl;
            else
            {
                ll md=k/(n-1);
                ll md2=k%(n-1);
                if(md2!=0)
                {
                    cout<<md*n+md2<<endl;
                }
                else
                    cout<<md*n-1<<endl;
            }
        }
    }

     

         题意:两个人各从首尾开始吃,要求一个人吃的要比另一个人上次吃的多,求把所有糖果吃完需要的步骤数以及两人各吃的权值。

         解析:暴力模拟,注意下细节即可。要吃的大于另一个人吃的而不是大于等于,这里注意一下。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e3+10;
    int a[maxn];
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            cin>>n;
            for(int i=1;i<=n;i++)
                cin>>a[i];
            int l=0,r=0,ans=0;
            ans=1;
            l=a[1];
            int ll=2,rr=n;
            int ok=0;
            int sumr=0,suml=a[1];
            while(1)
            {
                int md=0,i;
                if(!ok)
                {                
                    for(i=rr;i>=ll;i--)
                    {                    
                        r+=a[i];
                        sumr+=a[i];
                        if(sumr>suml)
                        {
                            ans++;
                            suml=0;
                            rr=i-1;
                            md=1;
                            break;
                        }
                    }
                    ok=1;
                }
                else
                {
                    
                    for(i=ll;i<=rr;i++)
                    {
                        
                        l+=a[i];
                        suml+=a[i];
                        if(suml>sumr)
                        {
                            ans++;
                            sumr=0;
                            ll=i+1;
                            md=1;
                            break;
                        }
                    }
                    ok=0;
                }
                if(!md)
                {
                    //cout<<ll<<"-"<<rr<<endl;
                    if(ll<=rr)
                    ans++;
                    break;
                }
            }
            cout<<ans<<" "<<l<<" "<<r<<endl;
        }
    }

     

        题意:找出特殊数的数目,特殊数ai=al+....+ar。而且每个数<=n。

          解析:  先前缀和处理。然后暴力找到每一个区间,如果某段区间和<=n,那么说明这段区间和是有可能等于某个ai(已知ai<=n)的,把它标记。然后遍历整个序列,如果被标记了,说明有一段区间和是等于它的,它就是一个特殊数。

    //´ÓпªÊ¼~
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=8e3+10;
    int a[maxn],vis[maxn],num[maxn];
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n ;
            memset(vis,0,sizeof(vis));
            cin>>n;
            for(int i=1;i<=n;i++)
                cin>>a[i];
            for(int i=1;i<=n;i++)
                num[i]=num[i-1]+a[i];
            for(int i=2;i<=n;i++)
            {
                for(int j=0;j<i-1;j++)
                {
                    int md=num[i]-num[j];
                    if(md<=n)
                        vis[md]=1;
                }
            }
            int ans=0;
            for(int i=1;i<=n;i++)
            {
                if(vis[a[i]])
                    ans++;
            }
            cout<<ans<<endl;
        }
    } 

         题意:构造一个序列,满足给定的00数,01数,11数。

          解析:先构造000...,然后是11111.....,最后是010101.....题中已经规定必然存在解,那么当01数为0的时候,00和01是不可能全不为0的。所以可以先让01数为0,分开讨论输出。01不为0,就可以直接构造,但是注意0000011111中间有个01,这里是要算一个01数的,所以打印01的时候,少打一个即可。

    //´ÓпªÊ¼~
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+10;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int a,b,c;
            cin>>a>>b>>c;
            if(b==0)
            {
                if(a!=0)
                {
                    for(int i=1;i<=a+1;i++)
                        cout<<0;
                        cout<<endl;
                }
                if(c!=0)
                {
                    for(int i=1;i<=c+1;i++)
                        cout<<1;
                        cout<<endl;
                }
                continue;
            }
            for(int i=1;i<=a+1;i++)
                cout<<0;
            for(int i=1;i<=c+1;i++)
                cout<<1;
            for(int i=0;i<b-1;i++)
                cout<<i%2;
            cout<<endl;
        }
    } 

     

         题意:给出n,有一个含有n个数而且大小为1-n。构造出一个排列顺序,使得每个数的间距大于等于2小于等于4。

         解析:n<=3,是肯定无解的。我这里是根据奇偶性来构造,比如n是奇数,可以先1  3  5 ......然后打印偶数,但是要先把第二大和第一大的偶数打出来,然后再打比第二大小的,具体看代码:

    //从新开始~
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+10;
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            cin>>n;
            if(n<=3)
            {
                cout<<"-1"<<endl;continue;
            }
            if(n%2==0)
            {
                for(int i=2;i<=n;i+=2)
                {
                    cout<<i<<" ";
                }
                cout<<n-3<<" "<<n-1<<" ";
                for(int i=n-5;i>=1;i-=2)
                    cout<<i<<" ";
                    
            }
            else
            {
                for(int i=1;i<=n;i+=2)
                    cout<<i<<" ";
                cout<<n-3<<" "<<n-1<<" ";
                for(int i=n-5;i>=1;i-=2)
                    cout<<i<<" ";
            }
            cout<<endl;
        }
    } 
  • 相关阅读:
    AjaxControlToolKit(整理)三.......(35个控件)简单介绍
    C#多线程学习
    《深入浅出WPF》视频列表
    【Redis】Redis功能及性能
    MySQL性能优化
    【Redis】Redis常用命令
    php项目相关资源
    JAVA基础知识总结:十一
    JAVA基础知识总结:九
    JAVA基础知识总结:十
  • 原文地址:https://www.cnblogs.com/liyexin/p/12870449.html
Copyright © 2011-2022 走看看