Codeforces Round#808 div.1+div.2题解

Posted 欣君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round#808 div.1+div.2题解相关的知识,希望对你有一定的参考价值。

视频讲解:BV1ya411S7KF

div.2-A. Difference Operations

题目大意

给定长度为 n n n 的数组 a a a ,可以进行任意次操作,每次操作选择一个整数 i ∈ [ 2 , n ] i\\in[2,n] i[2,n] a i a_i ai 修改为 a i − a i − 1 a_i-a_i-1 aiai1

问能否对所有 i ∈ [ 2 , n ] i\\in[2,n] i[2,n] ,使得 a i = 0 a_i=0 ai=0

题解

从左到右考虑。
若使得 a 1 = 0 a_1=0 a1=0 ,则必须 a 0 ∣ a 1 a_0|a_1 a0a1
若使得 a 2 = 0 a_2=0 a2=0 ,则必须存在 k ∈ [ 0 , a 1 a 0 ] k\\in[0,\\fraca_1a_0] k[0,a0a1] ,使得 ( a 1 − k ∗ a i ) ∣ a 2 (a_1-k*a_i)|a_2 (a1kai)a2 ,即 a 0 ∣ a 2 a_0|a_2 a0a2
以此类推,必须对于所有 i ∈ [ 2 , n ] i\\in[2,n] i[2,n] ,满足 a 0 ∣ a i a_0|a_i a0ai ,才存在合法方案。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXN=110;
int a[MAXN];

int main()

	int T,n,i,flag;
	scanf("%d",&T);
	while(T--)
	
		scanf("%d",&n);
		flag=1;
		for(i=1;i<=n;i++)
		
			scanf("%d",&a[i]);
			if(a[i]%a[1])
				flag=0;
		
		if(flag)
			puts("YES");
		else
			puts("NO");
	

div.2-B. Difference of GCDs

题目大意

给定 n ( 1 ≤ n ≤ 1 0 5 ) , l , r ( 1 ≤ l ≤ r ≤ 1 0 9 ) n(1 \\leq n \\leq 10^5),l,r(1 \\leq l \\leq r \\leq 10^9) n(1n105)l,r(1lr109) ,构造长为 n n n 的数组 a 1 , a 2 , . . . , a n ( l ≤ a i ≤ r ) a_1,a_2,...,a_n(l \\leq a_i \\leq r) a1,a2,...,an(lair) ,使得 g c d ( i , a i ) gcd(i,a_i) gcd(i,ai) 均不同。

题解

注意到 g c d ( i , a i ) ∈ [ 1 , i ] gcd(i,a_i)\\in[1,i] gcd(i,ai)[1,i] ,因此若使得 g c d ( i , a i ) gcd(i,a_i) gcd(i,ai) 均不同,则必须 g c d ( i , a i ) = i gcd(i,a_i)=i gcd(i,ai)=i ,即 i ∣ a i i|a_i iai

因此对于每个 i i i ,在 [ l , r ] [l,r] [l,r] 区间内寻找是否存在 i i i 的倍数即可。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXN=100100;
int a[MAXN];

int main()

	int T,n,l,r,i,flag;
	scanf("%d",&T);
	while(T--)
	
		scanf("%d%d%d",&n,&l,&r);
		flag=1;
		for(i=1;i<=n;i++)
		
			a[i]=r/i*i;
			if(a[i]<l)
			
				flag=0;
				break;
			
		
		if(!flag)
			puts("NO");
		else
		
			puts("YES");
			for(i=1;i<=n;i++)
				printf("%d ",a[i]);
			puts("");
		
	

div.1-A/div.2-C. Doremy’s IQ

题目大意

Doremy有 n n n 场考试,第 i i i 场考试只能在第 i i i 天进行,难度为 a i a_i ai 。初始IQ为 q ( 1 ≤ q ≤ 1 0 9 ) q(1 \\leq q \\leq 10^9) q(1q109) ,每场考试可以选择参加或不参加。 q > 0 q>0 q>0 时才能参加考试,若参加,则会产生以下影响:

  • a i > q a_i>q ai>q ,则 q q q 减少 1 1 1
  • 否则不变

求最多可以参加的考试数。

题解

由于不论 a i a_i ai 多少,只要 a i > q a_i>q ai>q 都会使得 q q q 减少 1 1 1 ,因此贪心考虑,将降智考试全部排在最后即可。

可以简单证明,将一个降智考试从早调整到晚后,必定会产生不更差的结果。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXN=100100;
int a[MAXN],ans[MAXN];

int main()

	int T,n,q,i,now;
	scanf("%d",&T);
	while(T--)
	
		scanf("%d%d",&n,&q);
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		memset(ans,0,sizeof(int)*(n+5));
		now=0;
		for(i=n;i>=1&&now<q;i--)
		
			ans[i]=1;
			if(now<a[i])
				now++;
		
		for(i;i>=1以上是关于Codeforces Round#808 div.1+div.2题解的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round#808 div.1+div.2题解

Codeforces Round#808 div.1+div.2题解

Educational Codeforces Round 21 Problem F (Codeforces 808F) - 最小割 - 二分答案

Codeforces Round #705 (Div. 2)

Codeforces Round #774 (Div. 2)

Codeforces Round #717 (Div. 2)