Codeforces Round #640 (Div. 4)(ABCDEG题解)
文章目录
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 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;
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){ //0
for(int i=0;i<n;i++){
int f=i%4;
printf("%d ",a[x[f]+i-f]);
}
printf("\n");
}
else if(n%4==1){ //1
for(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;
}
题解 文章被收录于专栏
主要写一些题目的题解