Codeforces Round #276 (Div. 2) 解题报告

题目地址:http://codeforces.com/contest/485

A题:Factory

按照过程模拟,并判断是否出现循环,如果出现循环,说明肯定不可能,直接跳出。

代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int _hash[100001];
int main()
{
    int a, m, i, flag=0;
    memset(_hash,0,sizeof(_hash));
    scanf("%d%d",&a,&m);
    a=a%m;
    _hash[a]=1;
    while(1)
    {
        a=a*2%m;
        if(a==0)
        {
            flag=1;
            break;
        }
        if(_hash[a])
        {
            break;
        }
        _hash[a]=1;
    }
    if(!flag) puts("No");
    else
        puts("Yes");
    return 0;
}

B题:Valuable Resources

直接找行与列的最大值和最小值,不多说

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
const LL INF=1e11;

int main()
{
    LL n, x, y, max1, max2, min1, min2, s;
    while(scanf("%I64d",&n)!=EOF)
    {
        max1=-INF;
        max2=-INF;
        min1=INF;
        min2=INF;
        while(n--)
        {
            scanf("%I64d%I64d",&x,&y);
            max1=max(max1,x);
            max2=max(max2,y);
            min1=min(min1,x);
            min2=min(min2,y);
        }
        s=max(max1-min1,max2-min2);
        s*=s;
        printf("%I64d\n",s);
    }
    return 0;
}

C题:Bits

贪心

从小的开始,不断从低位开始加1,直到大于较大数为止。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
const LL INF=1e11;
int s[1000];
int main()
{
    int n, len, max1;
    LL x, y, z1, z, i;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%I64d%I64d",&x,&y);
        z1=x;
        len=0;
        memset(s,0,sizeof(s));
        while(z1)
        {
            s[len++]=z1%2;
            z1/=2;
        }
        z=x;
        for(i=0;i<100;i++)
        {
            if(s[i]==0)
            {
                x+=(LL)1<<i;
                //printf("%d\n",1<<i);
                if(x>y)
                {
                    printf("%I64d\n",z);
                    break;
                }
                z=x;
            }
        }
    }
    return 0;
}

D题:Maximum Value

对于x来说,在k*x~(k+1)*x这段范围内,余数最大的肯定是最接近(k+1)*x的数,所以可以预处理出来所有最接近当前数的数,然后分别枚举每个数的倍数,并不断更新即可。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
const int INF=0x3f3f3f3f;
int _hash[2100000], dp[2100000], a[2100000];
int main()
{
    int n, i, j, x, min1, ans, max1;
    while(scanf("%d",&n)!=EOF)
    {
        memset(_hash,0,sizeof(_hash));
        min1=INF;
        max1=-1;
        for(i=0; i<n; i++)
        {
            scanf("%d",&x);
            _hash[x]=1;
            min1=min(min1,x);
            max1=max(max1,x);
        }
        for(i=min1; i<=2000000; i++)
        {
            if(_hash[i-1]) dp[i]=i-1;
            else dp[i]=dp[i-1];
        }
        ans=0;
        for(i=1; i<=1000000; i++)
        {
            if(_hash[i])
            {
                for(j=2*i; ; j+=i)
                {
                    if(dp[j]<i) continue ;
                    ans=max(ans,dp[j]%i);
                    if(dp[j]==max1) break;
                    //printf("%d %d\n",j,ans);
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值