BestCoder Round #79 (div.2) hdu 5660 ,hdu 5661

来源:互联网 发布:流畅的python 编辑:程序博客网 时间:2024/05/21 06:40

porblem 1001 ( hdu 5660 )
题意:
jrMz有两种角,第一种角都是正nnn边形的内角,第二种角都是正mmm边形的内角。jrMz想选出其中一些,某种角可以选多个或一个都不选,使得选出的所有角的度数之和恰好为360度。jrMz想知道这是否可能实现。
有多组测试数据,第一行一个整数(1≤T≤10),表示测试数据的组数。
对于每组测试数据,仅一行,两个整数n,m(3≤n,m≤100),之间有一个空格隔开。
可以实现则输出Yes,否则输出No。
题解:
很简单的题,只需要用数学公式求出两个正多边形的内角,在暴力枚举是否能构成360度即可,然而公式中有除法操作,是否需要考虑精度问题呢?我也不知道,反正数据范围之内的貌似不用(有人不考虑也过了),然而我还是重新改了一次代码,将等式左右化简为了不用除的方法,也过了。
代码:

#include<iostream>#include<algorithm>#include<stdio.h>using namespace std;int n,m,T;int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        int n1=m*(n-2);        int n2=n*(m-2);        int ans=2*m*n;        int sum=0;        int flag=0;        while(sum<=ans)        {            if((ans-sum)%n2==0)            {                flag=1;                break;            }            sum+=n1;        }        if (flag) printf("Yes\n");        else printf("No\n");    }}

problem 1002 ( hdu 5661)
题意:

有四个正整数a,b,c,d,满足a≤b且c≤d。选择两个整数x,y,满足a≤x≤b且c≤y≤d,使得x XOR y的值最大,输出最大值。

题解:
这道题还是比较厉害,想出这种做法的人也是比较厉害,没有用什么恶心的搜索,ORZ,在此题中首先想到一定需要按位来做题,每次从高位到低位优先去取让x与y此位为不同的那种方法,然后再考虑这位上相同的做法,具体实现看代码。

代码:

#include<iostream>#include<algorithm>#include<stdio.h>using namespace std;typedef long long LL;LL a,b,c,d;int T;bool pan(LL x,LL y,int i){    LL mx=x+(1LL<<i)-1;//假设从此之后x的位上都取1    LL my=y+(1LL<<i)-1;//假设从此之后y的位上都取1    //此时mx,my分别是x与y在取当前位上取当前状态后,还能够构成的最大数    if (x>b || mx<a) return 0;//如果当前x超过范围,或者它还能构成的最大数还不能达到范围,那么此状态是错的    if (y>d || my<c) return 0;    return 1;}int main(){    scanf("%d",&T);    while(T--)    {        //cin>>a>>b>>c>>d;        scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&d);        LL zz=0,yy=0;        for (int i=63;i>=0;i--)        {            //分别判断四种情况,注意优先判断位上不同的情况            if (pan(zz,yy+(1LL<<i),i))//x的i位上为0,y的i位上为1,判断            yy+=(1LL<<i);            else if (pan(zz+(1LL<<i),yy,i))            zz+=(1LL<<i);            else if (pan(zz+(1LL<<i),yy+(1LL<<i),i))            {                zz+=(1LL<<i);                yy+=(1LL<<i);            }            else continue;                  }        printf("%I64d\n",zz^yy);        //cout<<(zz^yy)<<endl;    }}
0 0