Codeforces Round #640 (Div. 4)
A 输出非零位
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,m;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
vector<int> ve;
int cnt=0;
while(n)
{
if(n%10) ve.push_back((n%10)*pow(10,cnt));
cnt++;
n/=10;
}
cout<<ve.size()<<endl;
for(auto i:ve)
cout<<i<<' ';
puts("");
}
return 0;
}
B 全是奇数时,前k-1个都为1,判断最后一个是否为奇数;
全是偶数时,前k-1个都是2,判断最后一个是否为偶数;(最后一个数大于0)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,m;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
if(m>n) puts("NO");
else if((n-m+1)&1)
{
puts("YES");
for(int i=0;i<m-1;i++) cout<<1<<' ';
cout<<n-m+1<<endl;
}
else if((n-m*2+2)>0&&(n-m*2+2)%2==0)
{
puts("YES");
for(int i=0;i<m-1;i++) cout<<2<<' ';
cout<<n-m*2+2<<endl;
}
else puts("NO");
}
return 0;
}
C 除了n的倍数其余全都是。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,k;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
ll x=(k+n-2)/(n-1)-1;
cout<<1ll*x*n+(k-x*(n-1))<<endl;
}
return 0;
}
D 双指针扫一遍即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,k;
int s[N];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",s+i);
int l=0,r=n-1,cnt=0;
int a=0,b=0,sum1=0,sum2=0;
while(l<=r)
{
int res=0;
if(cnt&1)
{
while(res<=sum1&&l<=r)
res+=s[r--];
sum2=res;
b+=res;
}
else
{
while(res<=sum2&&l<=r)
res+=s[l++];
sum1=res;
a+=res;
}
cnt++;
}
printf("%d %d %d\n",cnt,a,b);
}
return 0;
}
E n的总合不超过8000,O(n^2)就可以了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=8010;
int t,n,k;
int s[N],b[N];//b[i]表示i的个数
//int f[N][N],f[i][j]表示以第一个数为右端点长度为j的区间和,会超内存
int f[2][N];//f[i][]只与f[i-1][]有关,滚动数组优化省内存,其实前缀和更简单
bool st[N];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<=n;i++) b[i]=0,st[i]=0;
for(int i=1;i<=n;i++) scanf("%d",s+i),b[s[i]]++;
int cnt=0;
f[1][1]=s[1];
for(int i=2;i<=n;i++)
{
f[i&1][1]=s[i];
for(int j=2;j<=i;j++)
{
int num=f[i&1][j]=f[i-1&1][j-1]+s[i];
if(num<=n&&!st[num])
{
cnt+=b[num];
st[num]=1;
}
}
}
printf("%d\n",cnt);
}
return 0;
}
F 分情况模拟即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,k,a,b,c;
int s[N];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&a,&b,&c);
if(c)
{
if(b&1)
{
for(int i=0;i<=c;i++) printf("1");
for(int i=0;i<b;i++)
printf("%d",i&1?1:0);
for(int i=1;i<=a;i++) printf("0");
}
else if(b)
{
for(int i=0;i<=c;i++) printf("1");
for(int i=0;i<=a;i++) printf("0");
for(int i=1;i<b;i++) printf("%d",i%2);
}
else
for(int i=0;i<=c;i++) printf("1");//a,c不等0,b等0的情况不存在
}
else
{
for(int i=0;i<=a;i++) printf("0");
for(int i=1;i<=b;i++) printf("%d",i%2);
}
puts("");
}
return 0;
}
G n大于4时排奇数再排偶数一定可以,n=4特判。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=8010;
int t,n,k;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n<4) puts("-1");
else if(n==4) puts("2 4 1 3");
else
{
if(n&1)
{
for(int i=1;i<=n;i+=2) printf("%d ",i);
printf("%d %d ",n-3,n-1);
for(int i=n-5;i;i-=2) printf("%d ",i);
}
else
{
for(int i=1;i<=n;i+=2) printf("%d ",i);
printf("%d %d %d ",n-4,n,n-2);
for(int i=n-6;i;i-=2) printf("%d ",i);
}
puts("");
}
}
return 0;
}