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