Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) A-D题解

比赛传送门

A. In Search of an Easy Problem

最朴素的解法,扫一边有木有1。。。。。

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
template<typename T> void read(T &num){
	char c=getchar();num=0;int f=1;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	num*=f;
}
template<typename T> void qwq(T x){
	if(x>9)qwq(x/10);
	putchar(x%10+'0');
}
template<typename T> void write(T x){
	if(x<0){x=-x;putchar('-');}
	qwq(x);putchar('\n');
}
int container[110];

int main(){
	int n;read(n);
	rep(i,1,n){
			read(container[i]);
	}
	
	int nop=0;
	rep(i,1,n){
		if(container[i]==1){
			nop=1;
			break;
		}
	}
	
	if(nop==1){
		puts("HARD");
	}else{
		puts("EASY");
	}
	return 0;
}

B. Vasya and Cornfield

可以看出,在该矩形的所有点中,

0+d=d <=点的x坐标+点的y坐标<= n+(n-d)=2n-d;

0-d=-d<=点的x坐标-点的y坐标<=n-(n-d)=d;

依照以上规律判断即可

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
int container[110][3];

int main(){
	int n,d,m;cin>>n>>d>>m;
	rep(i,1,m){
		cin>>container[i][1]>>container[i][2];
	}
	
	for(int i=1;i<=m;i++){
		int temp=container[i][1]+container[i][2];
		int nop=container[i][1]-container[i][2];
		if(d<=temp&&temp<=2*n-d&&-d<=nop&&nop<=d){
			puts("YES");
		}else{
			puts("NO");
		}
	}
	return 0;
}

C. Vasya and Golden Ticket

首先维护该数列的前缀和数组,在提取出所有总和的因数作为分割后可能的每个数列的和,

然后一波骚操作即可。

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
template<typename T> void read(T &num){
	char c=getchar();num=0;int f=1;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	num*=f;
}
template<typename T> void qwq(T x){
	if(x>9)qwq(x/10);
	putchar(x%10+'0');
}
template<typename T> void write(T x){
	if(x<0){x=-x;putchar('-');}
	qwq(x);putchar('\n');
}
int container[110];
int qz[110];
set<int>v;

int main(){
	int n;read(n);
	rep(i,1,n){
		char ch;cin>>ch;
		container[i]=ch-'0';
		qz[i]=qz[i-1]+container[i];
	}
	
	for(int i=1;i*i<=qz[n];i++){
		if(qz[n]%i==0){
			v.insert(i);v.insert(qz[n]/i);
		}
	}
	
	if(qz[n]==0){
		puts("YES");return 0;
	}
	v.erase(v.find(qz[n]));
	
	set<int>::iterator it;
	for(it=v.begin();it!=v.end();it++){
		int l=0;int nop=*it;bool flag=true;
		rep(i,1,n){
			if(qz[i]-qz[l]>nop){flag=false;break;}
			if(qz[i]-qz[l]==nop){
				l=i;
			}
		}
		if(flag==true){puts("YES");return 0;}
	}
	puts("NO");
	return 0;
}

D. Vasya and Triangle

首先,坐标系中的任何一个三角形,

其面积计算都可以看成是一个长高皆为整数,减去若干个底和高皆为整数的三角形的面积和。

所以目标三角形的面积只可能是整数,或一个整数+0.5,其他情况都不可能有解。

这一步判断完后,我们计算出三角形面积*2,再枚举底(总而算出高),

看底和高是否在规定范围内(注:光从1开始枚举会超时,需要优化循环次数)

#include<bits/stdc++.h>
#define ll long long
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
inline long long gcd(ll n,ll m){
	if(n%m==0)return m;
	return gcd(m,n%m);
}
set<int>v;

int main(){
	ll n,m,k;
	scanf("%lld%lld%lld",&n,&m,&k);
	
	ll temp1=n*m;ll temp2=k;
	ll temp3=gcd(temp1,temp2);
	temp1/=temp3;temp2/=temp3;
	if(temp2>2){
		puts("NO");
		return 0;
	}
	
	ll nop=n*m*2;nop/=k;
	
	ll start=min(nop/n,nop/m);
	bool flag=false;ll h=0;ll l=0;
	for(long long i=max(start,1ll);i*i<=nop;i++){
		if(i>n||i>m)break;
		if(nop%i==0){
			if(i<=n&&nop/i<=m){
				h=i;l=nop/i;
				flag=true;break;
			}
			if(i<=m&&nop/i<=n){
				h=nop/i;l=i;
				flag=true;break;
			}
		}
	} 
	
	if(flag==true){
		puts("YES");
	}else{
		puts("NO");return 0;
	}
	
	cout<<0<<" "<<0<<endl;
	cout<<h<<" "<<0<<endl;
	cout<<0<<" "<<l<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Bill_Benation/article/details/82827952