A
水题,不贴代码了。
B
判断一个点是否在矩形内,利用外积判断角度即可, 本题还可引申为判断点是否在凸多边形内,在多边形内。
#include<bits/stdc++.h>
using namespace std;
int n,d,m;
int main()
{
cin>>n>>d;
cin>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
int _1=(n-d)*(y-d)-(n-d)*x;
int _2=(d-n)*(y-n+d)-(d-n)*(x-n);
int _3=(-d)*y-d*(x-d);
int _4=d*(y-n)-(-d)*(x-n+d);
if(_1*_2>=0&&_3*_4>=0)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
C
通过计算发现暴力的复杂度并不高,所以模拟即可,但是本题不是很好写,女娲补天过的。。。
#include<bits/stdc++.h>
using namespace std;
int n;
string a;
int main()
{
cin>>n;
cin>>a;
int sum=0;
string str="";
for(int i=0; i<n; i++)
{
if(a[i]!='0') str+=a[i];
sum+=a[i]-'0';
}
bool ok=true;
bool flag=false;
for(int i=1; i<=sum; i++)
{
int tem=0;
int cnt=0;
ok=true;
for(int j=0; j<str.length(); j++)
{
tem+=str[j]-'0';
if(tem>i)
{
ok=false;
break;
}
if(tem==i)
{
tem=0;
cnt++;
if(j==str.length()-1) flag=true;
continue;
}
}
if(ok&&cnt>1&&flag)
{
break;
}
if(!flag) ok=false;
if(cnt==1) ok=false;
}
if(ok) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
D
应该是前4题中最不可做的一个。
首先介绍一下皮克定理,对于一个所有顶点都在网格点上的多边形,面积满足S=(2*a+b-2)/2。其中,a是多边形内格点的个数,b是多边形上格点的个数。
所以我们发现,格点上三角形的面积一定是1/2的整数倍。所以三角形底乘高一定是整数。
本题要求我们构造出一个这样的三角形满足S=n*m/k,直角三角形自然是最好构造的,我们让一个顶点就在原点,并设两条直角边长度分别为a和b。
由顶点横坐标不大于n,纵坐标不大于m,并结合面积关系。
容易解出不等式 ①
②
观察2n/k,因为k>=2,令t=gcd(2n,k),若t>=2,我们令a=2n/t,此时不等式2已经成立,其实已经无需去验证不等式1了,它一定是成立的,通过面积关系我们可以解出a。若t=1,令a=n,同理,不等式2成立,无需再验证不等式1,根据面积关系解出b。
#include<bits/stdc++.h>
using namespace std;
long long n,m,k;
int main()
{
cin>>n>>m>>k;
if(2*n*m%k!=0)
{
cout<<"NO"<<endl;
return 0;
}
int t=__gcd(2*n,k);
int a=2*n/t;
int b=m*t/k;
cout<<"YES"<<endl;
if(t!=1)
{
cout<<0<<" "<<0<<endl;
cout<<a<<" "<<0<<endl;
cout<<0<<" "<<b<<endl;
}
else
{
cout<<0<<" "<<0<<endl;
cout<<n<<" "<<0<<endl;
cout<<0<<" "<<2*m/k<<endl;
}
return 0;
}