Permutation
思路:每次选择2∗x%n,3∗x%n,如果两个都选择了,就输出‘-1’;
#include<iostream> #include<vector> #include<cstring> using namespace std; const int maxn=1e6+10; bool vis[maxn]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { int flag=0,b; cin>>b; memset(vis,0,sizeof(vis)); vector<int>s; int j=0; vis[1]=1; s.push_back(1); while(1) { if(s.size()==b-1) break; int u=s[j++]; int temp1=2*u%b,temp2=3*u%b; if(vis[temp1]==0) { vis[temp1]=1; s.push_back(temp1); } else if(vis[temp2]==0) { vis[temp2]=1; s.push_back(temp2); } else { flag=1; break; } } if(flag) { cout<<"-1"<<endl; } else { for(int k=0;k<s.size();k++) cout<<s[k]<<" "; cout<<endl; } } return 0; }
Game
思路:从左到右将所选择的数到初始的数平分,如果不能平分,则分为2总数,两总数相差不超过1,每次选择最大的数。
#include<iostream> using namespace std; const int maxn=1e5+10; long long int a[maxn],pre[maxn]; int main() { int n; cin>>n; while(n--) { long long int x=-1; int t; scanf("%d",&t); pre[0]=0; for(int i=1;i<=t;i++) { scanf("%lld",&a[i]); pre[i]=pre[i-1]+a[i]; long long z=pre[i]/i; if(pre[i]%i!=0) { z++; } x=max(x,z); } printf("%lld\n",x); } return 0; }