Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) A-D題解
阿新 • • 發佈:2018-12-11
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;
}