地址: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;
}
}