div4纯见证历史,凑热闹来的,没想到题目真不难,唯一的遗憾的是E题,想了半个多小时前缀和优化,最后还是暴力,我到现在还不太理解为什么这个做法不T,没有特殊数据卡一下吗?十分的扎心。
整体来看,题目还是很贴心的,可能是因为第一场div4,所以放了个海,不跟div3一样出一些十分头大的题目,全都是暴力模拟或者简单构造。
A题拆分数字,B题稍麻烦,我觉得也算是构造了,贪心想一想,如果都是偶数,就拆分成k-1个2和一个偶数的情况,如果都是奇数,就拆分成k-1个1和一个奇数的情况,也不难,C题全场最简单,大佬的一分钟题目,然而我边界卡了下,重新推了一遍公式,花了点时间,D题双指针?也不算,就是个分别从两侧开始的模拟,然而我手慢,也写了挺久的,E题看了一眼觉得8000 * 8000 * 1000,暴力肯定不成,得优化,然后不会优化,左眼瞪右眼搞了半个多小时,所以赛后发现大佬说暴力就能过,因为求前缀和的时候也<=8000,break就行的时候,我的内心是崩溃的,F和G都是简单构造,F算是全场最难的一个,细节比G多一点。
A
#include <iostream>
using namespace std;
typedef long long LL;
LL a[30];
int main()
{
int T; cin>>T;
while(T--){
LL x; cin>>x;
int cnt=0;
LL base=1;
while(x){
if(x%10){
a[cnt++]=x%10*base;
//cout<<x%10*base<<" ";
}
x/=10;
base*=10;
}
cout<<cnt<<endl;
for(int i=0;i<cnt;i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
B
#include <iostream>
using namespace std;
int main()
{
int T; cin>>T;
while(T--){
int x,k; cin>>x>>k;
if(x<k){
cout<<"NO"<<endl;
continue;
}
if((x-(k-1))%2==1){
cout<<"YES"<<endl;
for(int i=0;i<k-1;i++)
cout<<1<<" ";
cout<<x-(k-1)<<endl;
}
else{
if(x>=2*k&&(x-(2*k-2))%2==0 ){
cout<<"YES"<<endl;
for(int i=0;i<k-1;i++)
cout<<2<<" ";
cout<<x-2*(k-1)<<endl;
}
else{
cout<<"NO"<<endl;
}
}
}
return 0;
}
C
#include <iostream>
using namespace std;
int main()
{
int T; cin>>T;
while(T--){
int n,k; cin>>n>>k;
int cnt=(k-1)/(n-1);
cout<<k+cnt<<endl;
}
return 0;
}
D
#include <iostream>
using namespace std;
int a[1005];
int main()
{
int T; cin>>T;
while(T--){
int n;cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int l=0,r=n-1,t=0,sum1=0,sum2=0,last=0;
int ans=0;
while(l<=r){
ans++;
if(t&1){
int now=0;
while(now<=last){
now+=a[r];
r--;
if(r<l) break;
}
last=now;
sum2+=now;
}
else{//µÚÒ»¸öÈË
int now=0;
while(now<=last){
now+=a[l];l++;
if(r<l) break;
}
last=now;
sum1+=now;
}
t++;
if(l>r) break;
}
cout<<ans<<" "<<sum1<<" "<<sum2<<endl;
}
return 0;
}
E
#include <iostream>
//这代码跑了46ms,我真的想死了···
using namespace std;
int f[8005],a[8005];
int main()
{
int T; cin>>T;
while(T--){
for(int i=0;i<=8000;i++) f[i]=a[i]=0;
int n; cin>>n;
for(int i=0;i<n;i++) cin>>a[i],f[a[i]]++;
int ans=0;
for(int i=0;i<n;i++){
int sum=a[i];
for(int j=i+1;j<n;j++){//因为n<=8000, 所以不T 这就nm离谱
sum+=a[j];
if(sum>n) break;
ans+=f[sum];
f[sum]=0;//防止重复计数
}
}
cout<<ans<<endl;
}
return 0;
}
F
#include <iostream>
using namespace std;
int main()
{
int T; cin>>T;
while(T--){
int a,b,c; cin>>a>>b>>c;
if(a+b==0 || b+c==0 || a+c==0){
if(a){
for(int i=0;i<=a;i++)
cout<<0;
}
else if(b){
for(int i=0;i<=b;i++){
if(i&1) cout<<0;
else cout<<1;
}
}
else{
for(int i=0;i<=c;i++)
cout<<1;
}
}
// else if(a==0 ||b==0 ||c==0){
//
// }
else{
for(int i=0;i<=a;i++)
cout<<0;
for(int i=0;i<(b-1)/2;i++)
cout<<"10";
for(int i=0;i<=c;i++)
cout<<1;
if(b%2==0&&b)
cout<<0;
}
cout<<endl;
}
return 0;
}
G
#include <iostream>
using namespace std;
int main()
{
int T; cin>>T;
while(T--){
int n; cin>>n;
if(n<=3) cout<<-1<<endl;
else if(n==4){
cout<<2<<" "<<4<<" "<<1<<" "<<3<<endl;
}
else{
for(int i=1;i<=n;i+=2){
cout<<i<<" ";
}
int x;
if(n%2==0) x=n-4;
else x=n-3,n--;
cout<<x<<" ";
for(int i=n;i>0;i-=2){
if(i!=x)
cout<<i<<" ";
}
cout<<endl;
}
}
return 0;
}