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;
}



京公网安备 11010502036488号