E:Game
题意:给定一个格子的从左到右的摆放序列,你可以将任意的格子由右向左移动,求可能得到的排列中最大的格子是最小的。
思路:因为格子只能由右向左移,所以从左向右不断相加其平均值的最大,不断更新该值,即可求出最小的最大值。
#include<bits/stdc++.h>
using namespace std;
long long a[123456];
int main()
{
int T, n;
cin >> T;
while(T--) //1e5
{
long long ans=0,k,maxn=0;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%lld", &a[i]);
ans+=a[i];
k=((ans-1)/i+1);
if(maxn<k) maxn=k;
//cout<<ans<<endl;
}
cout << maxn << endl;
}
return 0;
}
A:Permutation
题意:求一个长度为n-1的序列,元素为1-(n-1)且不重复,满足
xi+1≡2xi(mod p) or xi+1≡3xi(mod p),没有此序列则输出-1
思路:暴力标记一下,如果长度还没达到n-1,但是下一个数的2被取模和3倍取模都已经使用过了,则输出-1
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=1234567;
int t,n,a[maxn],flag;
bool vis[maxn];
int main()
{
cin>>t;
while(t--){
cin>>n;
flag=0;
memset(vis,false,sizeof(vis));
a[0]=1;
vis[1]=true;
for(int i=1;i<n-1;i++){
int k1=a[i-1]*2%n;
int k2=a[i-1]*3%n;
if(!vis[k1]){
a[i]=k1;
vis[k1]=true;
}
else if(!vis[k2]){
a[i]=k2;
vis[k2]=true;
}
else{
flag=1;
break;
}
}
if(flag) cout<<"-1"<<endl;
else{
for(int i=0;i<n-1;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
}
return 0;
}