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

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值