1. 程式人生 > >Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) A-D題解

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;
}