前言:说实话codeforce不挂VPN是真的绝望,我是当时被人拎去在比赛时间做的,然后那吃屎的速度硬是只让我A了前5T,反正写题半小时等待半小时。
A. Sum of Round Numbers
题意:给出n个数,输出每个数有几位不是0,然后下一行输出分解后的数
1111->输出 4
1000 100 10 1
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i)
{
int a,ans[6],cnt=0,t=1; //因为数据最大为1e4,所以ans开到6足够
cin>>a;
while(a) //a为0说明分解完毕
{
if(a%10==0)t*=10;
else {ans[++cnt]=(a%10)*t;t*=10;}
a/=10;
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;++i)
{
cout<<ans[i]<<" ";
}
cout<<endl;
}
}
B. Same Parity Summands
题意:共 t组数据,每组给一个n一个k,把n拆成k个同奇或同偶的数
思路:偶数就k-1个为2,剩下的为n-2*(k-1),奇数就全为1,剩下的为n-k。
然后考虑可行和不可行的所有情况。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int m,k;
cin>>m>>k;
if(m%2==1&&k%2==0){cout<<"NO"<<endl;continue;}
if(m%2==0&&k%2==1&&m<k*2){cout<<"NO"<<endl;continue;}
if(k%2==0&&m<k){cout<<"NO"<<endl;continue;}
if(m%2==1&&k>m){cout<<"NO"<<endl;continue;}
cout<<"YES"<<endl;
if(k%2==1&&m%2==0){
while(k!=1){
cout<<2<<" ";
m-=2;
k--;
}
cout<<m<<endl;
continue;
}
else if(k%2==0&&m%2==0){
while(k!=1){
cout<<1<<" ";
m--;
k--;
}
cout<<m<<endl;
continue;
}
if(m%2==1&&k%2==1){
while(k!=1)
{
cout<<1<<" ";
k--;
m--;
}
cout<<m<<endl;
}
}
}
C. K-th Not Divisible by n(沙雕题,连水题都不配)
题意:t组数据,每组给出n和k,求第k个不能被n整除的数
思路;一个n为1环,每环满足条件的数有n-1个,所以用sum=n*k/(n-1),
如果k被(n-1)整除,就sum-1,不然就加上k%(n-1)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b,sum=0;
cin>>a>>b;
sum=b/(a-1)*a;
if(b%(a-1)==0)sum-=1;
else sum+=b%(a-1);
cout<<sum<<endl;
}
}
D. Alice, Bob and Candies
没啥好说的deque还不会用的拖出去打死
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int t,s1=0,s2=0,next=0,cnt=1;
deque<int> p;
cin>>t;
for(int i=1;i<=t;++i)
{
int a;
cin>>a;
p.push_back(a);
}
next=p.front();
p.pop_front();
s1+=next;
while(!p.empty())
{
int sum=0;
++cnt;
if(cnt%2==1){
while(sum<=next&&!p.empty())
{
sum+=p.front();
p.pop_front();
}
next=sum;
s1+=sum;
continue;
}
else{
while(sum<=next&&!p.empty())
{
sum+=p.back();
p.pop_back();
}
next=sum;
s2+=sum;
continue;
}
}
cout<<cnt<<" "<<s1<<" "<<s2<<endl;
}
}
E. Special Elements
题意:能不写吗 求n个数的数列中有几个数可以用连续子区间的和表示。(讲道理这个数据量,摆明了一副快来大力上我的意思 )
思路:前缀和优化使查找区间和的时复为O(1),桶排使查找同样的数的时复为O(1),然后逐渐增大区间,遍历。
#include<bits/stdc++.h>
using namespace std;
int max(int a,int b)
{
if(a>b)return a;
return b;
}
int main(){
int n;
cin>>n;
while(n--){
int a[8006]={0},s[8006]={0},sum[8006]={0},mx=0,cnt=0;
int m;
cin>>m;
for(int i=1;i<=m;++i)
{
int a;
cin>>a;
s[a]++;
mx=max(mx,a);
sum[i]=sum[i-1]+a;
}
int l=2;
while(l<m)
{
for(int i=l;i<=m;++i)
{
int b=sum[i]-sum[i-l];
if(b<=mx)a[b]=1;
}
l++;
}
for(int i=2;i<=mx;++i){
if(a[i])cnt+=s[i];
}
cout<<cnt<<endl;
}
}
F. Binary String Reconstruction
题意:t组数据,每组给3个数n0,n1,n2,代表‘00’ ‘01’ ‘11’的字符个数
思路:(这道题我一开始抽风了,硬着头皮按先‘00’后‘01’再‘11’构造,然后我就烂了,wa了n发 )先构造00和11,如果n0和n2均不为0,n1-1,然后n1看前面的数是0还是1选择输出,如果没有数,那就自己造自己就完事
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
int main(){
int n;
cin>>n;
while(n--)
{
int a,b,c;
cin>>a>>b>>c;
if(c)
{
for(int i=1;i<=c+1;++i)
{
cout<<1;
}
}
if(a)
{
for(int j=1;j<=a+1;++j)
{
cout<<0;
}
}
if(a&&c)b--;
if(a==0&&c)
{
for(int i=1;i<=b;++i)
{
cout<<(i%2==1?0:1);
}
}
if(a){
for(int i=1;i<=b;++i)
{
cout<<(i%2==1?1:0);
}
}
if(a==0&&c==0)
{
cout<<1;
for(int i=1;i<=b;++i)
{
cout<<(i%2==1?0:1);
}
}
cout<<endl;
}
}
G. Special Permutation
题意:输入n,将1到n排列,相邻数据之差为2到4
思路:奇数偶数分开排,然后其中一个队列按降序排列,我是偶数在前,
最后2和4换个位置,同理可得如果n<4,则不存在
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b;
cin>>a;
if(a<4){cout<<-1<<endl;continue;}
b=a;
if(a%2==1)b=a-1;
while(b>4)
{
cout<<b<<" ";
b-=2;
}
if(b>4){cout<<2;cout<<" "<<4;}
else cout<<2<<" "<<4;
for(int i=1;i<=a;i+=2)
{
cout<<" "<<i;
}
cout<<endl;
}
}