Codeforces Round #686 (Div. 3)(A-E)
给你一个长度为 $n$ 的数组 $a$,使得第 $i$ 位数不等于 $a_i$。
把一个从 $1-n$ 的数组向右移动一位就好了。
#include<iostream> #include<algorithm> #include<iomanip> #include<cstring> #include<cstdio> #include<cmath> using namespace std; const int N=150; int n,t,a[N]; int main(){ // freopen("snakes.in","r",stdin); // freopen("snakes.out","w",stdout); cin>>t; while(t--){ cin>>n; memset(a,0,sizeof(a)); for(int i=1;i<=n;i++){ if(i!=1)a[i]=i-1; else a[i]=n; } for(int i=1;i<=n;i++){ cout<<a[i]<<" "; } cout<<endl; } return 0; }
给你一个长度为 $n$ 的数组,求出只出现一次且最小的数。
模拟就行。
#include<iostream> #include<algorithm> #include<iomanip> #include<cstring> #include<cstdio> #include<cmath> using namespace std; const int N=200050; int n,t,a[N],b[N]; int main(){ // freopen("snakes.in","r",stdin); // freopen("snakes.out","w",stdout); cin>>t; while(t--){ cin>>n;int o=0; memset(a,0,sizeof(a)); for(int i=1;i<=n;i++){ int x;cin>>x;a[x]++;b[x]=i; } for(int i=1;i<=n;i++){ if(a[i]==1){cout<<b[i]<<endl;o=1;break;} } if(o==0){cout<<-1<<endl;} } return 0; }
给你一个长度为 $n$ 的数组,选取数组中的一个数,问这个数最少可以把数组分成几段。
注意一个数出现在开头或结尾只会增加一段,其他地方出现且前面的数不等于当前的数就会增加两端。
还有一些细节看代码。
#include<iostream> #include<algorithm> #include<iomanip> #include<cstring> #include<cstdio> #include<cmath> using namespace std; const int N=200050; int n,t,a[N],b[N]; int main(){ // freopen("snakes.in","r",stdin); // freopen("snakes.out","w",stdout); cin>>t; while(t--){ cin>>n;int o=0; for(int i=1;i<=n;i++){ int x;cin>>a[i];b[i]=99999999; if(a[i]!=a[i-1]&&i!=1)o=1; } if(o==0){cout<<0<<endl;continue;} for(int i=1;i<=n;i++){ if(b[a[i]]==99999999){ if(i!=1&&i!=n) b[a[i]]=2; else b[a[i]]=1; } else{ if(i!=n&&a[i]!=a[i-1])b[a[i]]++; if(i==n&&a[i]==a[i-1])b[a[i]]--; } } int mins=99999999; for(int i=1;i<=n;i++){ mins=min(mins,b[i]); } cout<<mins<<endl; } return 0; }
给你一个 $n$,让你构造出一个数组 $a$, 长度为 $k$。
使得 $\prod^{k}_{i=1} a_i=n$
对于每个 $i$ 来说 $a_{i+1}$ % $a_i =0$。使得 $k$ 最大。
其实可以发现:$n$ 要被一个质数的平方整除 $k$ 才能加一。
否则不行,所以我们可以从 $2-\sqrt{n}$ 枚举既可以算出。
#include<iostream> #include<algorithm> #include<iomanip> #include<cstring> #include<cstdio> #include<cmath> using namespace std; const int N=2000500; long long t,n,a[N],top; int pd(long long x) { int f=2; if(x==2) return 1; while(x%f!=0&&f<=sqrt(x)) { f++; } if(x%f==0) return 0; else return 1; } int main(){ // freopen("snakes.in","r",stdin); // freopen("snakes.out","w",stdout); cin>>t; while(t--){ cin>>n;long long o=0; if(pd(n)==1){ cout<<1<<endl<<n<<endl;continue; } top=0;long long m=n; for(long long i=2;i<=sqrt(n);i++){ int k=0; while(n%(i*i)==0&&pd(i)==1){k++;n=n/i;} if(k>top){o=i;top=k;} n=m; } if(top==0){ cout<<1<<endl<<n<<endl;continue;} cout<<top+1<<endl; while(m%(o*o)==0){cout<<o<<" ";m=m/o;}cout<<m<<endl; } return 0; }

浙公网安备 33010602011771号