Codeforces #512 div2

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,并结合面积关系。

容易解出不等式 2m/k \leqslant b \leqslant m ①

                          2n/k \leqslant a \leqslant n   ②

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

猜你喜欢

转载自blog.csdn.net/zero___zero/article/details/82846044
今日推荐