Codeforces Round #637 (Div. 2)

A. Nastya and Rice

签到题

判断谷物总重量的范围和包重量范围是否有交叉

#include<bits/stdc++.h>

using namespace std;
int t,n,a,b,c,d;

int main(){
	cin>>t;
	while(t--){
		cin>>n>>a>>b>>c>>d;
		if(n*(a+b)<c-d || n*(a-b)>c+d){
			puts("No");
		}
		else puts("Yes");
	}

	return 0;
}

B. Nastya and Door

题意

在[l,l+k-1]范围内寻找山峰的个数最多且l最小

使用前缀和统计[1,i]的山峰个数,然后枚举比较得山峰个数最多且l最小的范围

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 2e5+100;
ll t,n,k,a[N],b[N];

int main(){
	cin>>t;
	while(t--){
		cin>>n>>k;
		for(int i=1;i<=n;i++) cin>>a[i];
		int l=-1,ans=-1,j=0;
		for(int i=2;i<=n;i++){
			if(a[i]>a[i-1]&&a[i]>a[i+1]&&i!=n){
				b[i]=b[i-1];
				b[i+1]=b[i-1]+1;
				i++;
			}
			else b[i]=b[i-1];
		}
		for(int i=1;i+k-1<=n;i++){
			if(b[i+k-1]-b[i+1]>ans){
				ans=b[i+k-1]-b[i+1];
				l=i;
			}
		}
		cout<<ans+1<<' '<<l<<'
';
	}

	return 0;
}

C. Nastya and Strange Generator

题意比题难系列:

由题中所给规则向一个空数组中添加数,问题中所给的数组是否满足该规则

添加规则

r数组本身为空,r[i]表示自身及右边第一个为空的位置
count数组如果该位置已经被选过置为0,没被选过表示在r数组中出现的次数
假设n=5,r[]={1,2,3,4,5},count[]={1,1,1,1,1}
1.向里面添加1,count值都相等,1的位置可以随便选,假设选在3,此时r[]={1,2,4,4,5},count[]={1,1,0,2,1}
2.向里面添加2,count[4]最大,所以2的位置选在4,此时r[]={1,2,5,5,5},count[]={1,1,0,0,3}
3.向里面添加3,count[5]最大,所以3的位置选在5,此时r[]={1,2,* ,* ,* },(* 表示不存在),count[]={1,1,0,0,0}
4.向里面添加4,count[1]= =count[2],所以选1或2都可以,假设选在1,r[]={2,2,* ,* ,* ,},count[]={0,2,0,0,0};显而易见5的位置在第二个
最后再结合题目最后所给步骤,可以得出 a[i+1]= =a[i]+1,或a[i+1]<a[i]

#include<bits/stdc++.h>

using namespace std;
const int N = 1e5+5;
int t,n,a[N];

int main(){
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++) cin>>a[i];
		bool flag=0;
		int l=a[1];
		for(int i=2;i<=n;i++){
			if(a[i]>l){
				if(a[i]!=a[i-1]+1){
					flag=1;
					break;
				}
				else l=a[i];
			}
			else l=a[i];
		}
		if(!flag) puts("Yes");
		else puts("No");
	}

	return 0;
}
七月在野,八月在宇,九月在户,十月蟋蟀入我床下
原文地址:https://www.cnblogs.com/voids5/p/12767998.html