Codeforces Round #609 题解

A题

大水题,从2枚举判断素数找到一组答案即可

B题

思维题,先对b数组排序,因为我们知道肯定存在答案,所以我们只要枚举每个a[i],使得x=b[1]-a[i](在同余的情况下,具体表达看代码),然后枚举x看看哪个是符合条件并且是最小的

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2110;
int a[N],b[N],c[N];
int x[N];
int main(){
   int n,m;
   cin>>n>>m;
   int i;
   for(i=1;i<=n;i++)
   cin>>a[i];
   for(i=1;i<=n;i++)
   cin>>b[i];
   sort(b+1,b+n+1);
   for(i=1;i<=n;i++)
   x[i]=(b[1]-a[i]+m)%m;
   int res=0x3f3f3f3f;
   for(i=1;i<=n;i++){
       int j;
       for(j=1;j<=n;j++)
       c[j]=(a[j]+x[i])%m;
       sort(c+1,c+n+1);
       for(j=1;j<=n;j++)
       if(c[j]!=b[j])
       break;
       if(j==n+1)
       res=min(res,x[i]);
   }
   cout<<res<<endl; 
}
 
View Code

C题

循环题目因为长度很长先看循环节,因为k后面的字符数组只被k前面的决定,而我们要找最小,首先把原始数组的前k个作为初始循环节,更新后,假如比原数组大,那么这肯定是答案。

如果比原数组小,那么我们就要考虑增大循环节并且是答案最小,那么显然只需要更改k-1这个位置也就是最后位置即可,因为这样保证更改是最小且比原数组大,注意进位判断。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=211000;
char res[N];
char s[N];
int main(){
   int n,k;
   cin>>n>>k;
   cin>>s;
   int i;
   for(i=0;i<n;i++)
   res[i]=s[i%k];
   if(strcmp(res,s)>=0){
       cout<<strlen(res)<<endl;
       cout<<res<<endl;
    return 0;    
   }
   int t=k-1;
   res[t]++;
   while(res[t]-'0'>=10){
       res[t]='0';
       res[t-1]++;
       t--;
   }
   for(i=0;i<n;i++)
   res[i]=res[i%k];
   cout<<strlen(res)<<endl;
   cout<<res<<endl;
}
 
View Code

猜你喜欢

转载自www.cnblogs.com/ctyakwf/p/12228201.html