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;
    }
} 
原文地址:https://www.cnblogs.com/liyexin/p/12870449.html