2020牛客暑期多校训练营(第十场)

A Permutation

题意;

给一个质数 p p p,求一个 1 1 1 ~ p − 1 p-1 p1的排列,满足 x i + 1 ≡ 2 x i ( m o d p ) x_{i+1}≡2x_i( mod p) xi+12xi(modp) o r or or x i + 1 ≡ 3 x i ( m o d p ) x_{i+1}≡3x_i(mod p) xi+13xi(modp)

1 1 1 开始选,能选 2 2 2 的倍数就选 2 ∗ x % p 2∗x\%p 2x%p,能选 3 3 3 的倍数就选 3 ∗ x % p 3∗x\%p 3x%p,不能选就输出 − 1 −1 1 就行。

AC代码:

const int N = 1e6 + 10;
int vis[N] = {0};
int main()
{

	int t;
	sd(t);
	while (t--)
	{
		vector<int> ans;
		int n;
		sd(n);
		rep(i, 1, n)
			vis[i] = 0;
		ans.pb(1), vis[1] = 1;
		int bas = 1;
		rep(i, 2, n - 1)
		{
			if (vis[2 * bas % n] == 0)
			{
				bas = 2 * bas % n;
				vis[bas] = 1;
				ans.pb(bas);
			}
			else if (vis[3 * bas % n] == 0)
			{
				bas = 3 * bas % n;
				vis[bas] = 1;
				ans.pb(bas);
			}
		}
		if (ans.size() == n - 1)
		{
			rep(i, 0, n - 2)
				printf("%d ", ans[i]);
			printf("\n");
		}
		else
			puts("-1");
	}
	return 0;
}

E Game

题意;

给你 n n n 列小方块,其中每列小方块有 a [ i ] a[i] a[i] 个,你可以选择任意位置从右往左推动小方块,如果此位置左边和上边也有小方块,它们会跟着一起移动,小方块移动后悬空就会落到下面的小方块上。移动到列 1 1 1 就不能移动了。

问若干次操作之后小方块的高度最大值的最小值 m a x i = 1 n b i max_{i=1}^nb_i maxi=1nbi

最终高度是从左边往右边递减,而右边比左边高的地方是可以推过去的,然后就记录前缀和,求每个位置的平均值并且取最大就行了。

AC代码:

const int N = 1e5 + 10;

int n, a[N];
ll sum, ans;

int main()
{
	int t;
	sd(t);
	while (t--)
	{
		sd(n);
		sum = ans = 0;
		ll res;
		rep(i, 1, n)
		{
			sd(a[i]);
			sum += a[i];
			res = (sum + i - 1) / i;
			ans = max(ans, res);
		}
		pld(ans);
	}
	return 0;
}

你可能感兴趣的:(牛客)