A. Permutation
题意
输出序列1~p-1,使其满足
解题
类似搜索,能乘2就乘2,否则乘3,总数量不足则无解。
int t;
int n,m;
int a[maxn];
bool vis[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
m = 0;
a[++m] = 1; vis[1] = 1;
bool flg = 1;
for(int i=2;i<n;++i)
{
int p = 2*a[i-1]%n;
if(!vis[p])
{
vis[p] = 1;
a[++m] = p; continue;
}
p = 3*a[i-1]%n;
if(!vis[p])
{
vis[p] = 1;
a[++m] = p; continue;
}
flg = 0; break;
}
if(!flg) puts("-1");
else {for(int i=1;i<n;++i) printf("%d ",a[i]); printf("\n");}
for(int i=1;i<n;++i) vis[i] = 0;
}
return 0;
}
E. Game
题意
每次操作可以把右边的一行格子向左移动,由于重力格子下落,可以操作任意次,求最小的最高高度。
解题
直觉是总数除以列数再向上取整,但是考虑一组样例1 20 1 1,自然可以想到求一下前缀平均值,取最大值就是答案。
int t;
int n,m;
ll a[maxn];
ll f[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
}
f[0] = 0;
for(int i=1;i<=n;++i)
{
f[i] = f[i-1] + a[i];
}
ll ans = 0;
for(int i=1;i<=n;++i)
{
f[i] = (f[i]+i-1)/i; ans = max(ans,f[i]);
}
printf("%lld\n",ans);
}
return 0;
}

京公网安备 11010502036488号