ホームページ  >  記事  >  ウェブフロントエンド  >  Codeforces ラウンド #276 (ディビジョン 2) ソリューション Report_html/css_WEB-ITnose

Codeforces ラウンド #276 (ディビジョン 2) ソリューション Report_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:54:36977ブラウズ

質問アドレス: 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: 貴重なリソース

行と列の最大値と最小値を直接見つけます。多くは言いません

コードは次のとおりです:

#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 __int64const 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: ビット

貪欲

小さな数字から始めて、大きい数字より大きくなるまで 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 __int64const 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: 最大値

x について、k*x~(k+1)*x の範囲で、最大の剰余を持つものが最も近いものでなければなりませんto (k+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 __int64const 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;}


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。