文章目录
- A. Sum of Round Numbers
- B - Same Parity Summands
- C - K-th Not Divisible by n
- D - Alice, Bob and Candies
- E - Special Elements
- F. Binary String Reconstruction
- G - Special Permutation
A. Sum of Round Numbers
题解:把他一个整数拆分,模拟一波即可
#pragma GCC optimize(3,"Ofast","inline")#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <math.h>#include <string>#include <list>#include <set>#include <map>#include <queue>#include <stack>#include <algorithm>#include <stdlib.h>#include <vector>#define maxn 200010const int MaxN = 0x3f3f3f3f;const int MinN = 0xc0c0c00c;typedef long long ll;const int mod = 1000007;using namespace std;int a[10];int main(){int t;cin>>t;while(t--){int n;cin>>n;int cnt=0;int ans=1;while(n){if(n%10!=0){a[cnt++]=(n%10)*ans;//cout<<"debug: "<<a[cnt-1]<<endl;}ans*=10;n/=10;}cout<<cnt<<endl;for(int i=0;i<cnt;i++){cout<<a[i]<<" ";}cout<<endl;}return 0;}
B - Same Parity Summands
题解:我们可以先假设全都用奇数表示出来,只需要将前k-1项为1(最小的奇数),在判断最后一项是否为奇数,再假设可以用偶数表示,如果前k-1项都可以用偶数表示2(最小得偶数即可),在判断最后一项是否为奇数
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 200010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[10];
int main()
{int t;cin>>t;while(t--){int n,k;cin>>n>>k;if((n-k+1)%2==1&&(n-k+1)>0){printf("YES\n");for(int i=0;i<k-1;i++){printf("1 ");}printf("%d\n",n-k+1);continue;}else if((n-2*(k-1))%2==0&&(n-2*(k-1))>0){printf("YES\n");for(int i=0;i<k-1;i++){printf("2 ");}printf("%d\n",n-2*(k-1));continue;}printf("NO\n");}return 0;
}
C - K-th Not Divisible by n
题解:把n和n的倍数抠出来再找k即可
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 200010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[10];
int main()
{int t;cin>>t;while(t--){ll n,k;cin>>n>>k;ll ans=k/(n-1);ll temp=ans*n+k%(n-1);if(k%(n-1)==0) temp--;cout<<temp<<endl;}return 0;
}
D - Alice, Bob and Candies
题解:模拟题
双指针往中间夹,注意处理一下细节即可
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 8010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[maxn];int main()
{int t;cin>>t;while(t--){int n;cin>>n;for(int i=1;i<=n;i++) scanf("%d",&a[i]);int l=1,r=n+1;int ans1=0,ans2=0,cnt=1,x=a[1],y=0;bool flag=false;ans1=a[1];while(l+1!=r){if(flag){cnt++,x=0;while(x<=y){if(l+1==r){break;}x+=a[++l];}ans1+=x;flag=false;}else{cnt++,y=0;while(y<=x){if(l+1==r){break;}y+=a[--r];}ans2+=y;flag=true;}}cout<<cnt<<" "<<ans1<<" "<<ans2<<endl;}
}
E - Special Elements
题解:我们可以对于每个数双指针操作
复杂度n2,不过没超时
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 8010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[maxn];int main()
{int t;cin>>t;while(t--){int n;cin>>n;for(int i=0;i<n;i++){scanf("%d",&a[i]);}int cnt=0;for(int i=0;i<n;i++){int l=0,r=0;ll ans=a[0];while(r<n){if(a[i]==ans&&l-r!=0){cnt++;break;}else if(a[i]<ans){ans-=a[l];l++;}else{r++;ans+=a[r];}//cout<<l<<" "<<r<<endl;}}printf("%d\n",cnt);}return 0;
}
F. Binary String Reconstruction
时间有限,大一刚入坑菜鸡,没写完
G - Special Permutation
题解:感觉应该会其他做法,这题让我硬生生写出了模拟的味道,感觉是找规律+模拟
首先你可以发现长度为2或者是3的数组是不可以的(直接pass掉)
- 最小长度为4即可,当然4的倍数长度的数组也是可以的
- 然后再看n%4=1的时候,那么n-5一定就是4的倍数,这样前n-5项按照4的倍数进行处理,最后五项自己找一下排序规则
- 然后再看n%4=2的时候,那么n-6一定就是4的倍数,这样前n-6项按照4的倍数进行处理,最后六项自己找一下排序规则
- 然后再看n%4=3的时候,那么n-7一定就是4的倍数,这样前n-7项按照4的倍数进行处理,最后七项自己找一下排序规则
怎么讲其按照自己预定的顺序输出呢?可以设置一个顺序数组即可
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn 200010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1000007;
using namespace std;
int a[maxn];
int x[10]={2,4,1,3};
int y[10]={1,3,5,2,4};
int z[10]={1,3,5,2,4,6};
int h[10]={1,4,7,3,5,2,6};
int main()
{int t;cin>>t;while(t--){int n;cin>>n;for(int i=1;i<=n;i++) a[i]=i;if(n==2||n==3){printf("-1\n");continue;}if(n%4==0){ //0for(int i=0;i<n;i++){int f=i%4;printf("%d ",a[x[f]+i-f]);}printf("\n");}else if(n%4==1){ //1for(int i=0;i<n-5;i++){int f=i%4;printf("%d ",a[x[f]+i-f]);}for(int i=0;i<5;i++){printf("%d ",a[y[i]+n-5]);}printf("\n");}else if(n%4==2){for(int i=0;i<n-6;i++){int f=i%4;printf("%d ",a[x[f]+i-f]);}for(int i=0;i<6;i++){printf("%d ",a[z[i]+n-6]);}printf("\n");}else if(n%4==3){for(int i=0;i<n-7;i++){int f=i%4;printf("%d ",a[x[f]+i-f]);}for(int i=0;i<7;i++){printf("%d ",a[h[i]+n-7]);}printf("\n");}}return 0;
}