CDOJ 1262 Memory

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDOJ 1262 Memory相关的知识,希望对你有一定的参考价值。

小x和小h是好盆友,小h从小体弱多病,而且还非常健忘,于是把自己平时吃的n瓶药都给小x等人保管。

某一天由于雾都的pm2.5爆表,小h的慢性呼吸道疾病又发作了,但当小x掏出药瓶的时候,却发现了异常情况。

小x现在有n瓶药,每瓶药里面有无限个药片,每片药重量严格等于1克。但是,吹毛求疵的小x发现n瓶药中有2瓶药的每一片药片在重量上是不合格的,不合格的药片比正常药片轻0.1g。

小x现在有一个电子称(能够显示具体重量),由于时间紧急,小x决定从每瓶药中选择bi(1bi)个药片,称量它们的总和,并且只称一次,从而找出这两瓶不合格药的编号。

现在,请问最小字典序的序列b(bi构成)是多少?

Input

一行一个整数n(2n52)

Output

一行n个数字,两两间用空格隔开,注意结尾没有空格。

 
题解 
暴力
主要是意识到使序列中任意两个元素之和不等
下面的代码还是2比较好的感觉……(尤其是红色字体,很实用的技巧)
 
#include<stdio.h>
#include<algorithm>
#include<set>

using namespace std;

int main(void)
{
    int n;
    int b[60];
    int cnt,temp;
    int i,j;
    set <int> s;
    
    scanf("%d",&n);
    b[1]=1;
    b[2]=2;
    s.insert(3);
    cnt=3;
    
    for (i=3;i<=n;++i)
    {
        while (true)
        {
            temp=1;
            for (j=1;j<=i-1;++j)
            {
                if (s.count(b[j]+cnt))
                {
                    ++cnt;
                    temp=0;
                    break;
                }
            }
            if (temp==1)
            {
                b[i]=cnt;
                for (j=1;j<=i-1;++j) s.insert(b[j]+cnt);
                ++cnt;
                break;
            }
        }
    }
    
    if (n==2) printf("1 1");
    else
    {
        printf("%d",b[1]);
        for (i=2;i<=n;++i) printf(" %d",b[i]);
    }
    
}

 

#include<stdio.h>
#include<algorithm>
#include<set>

using namespace std;

int b[60];
set <int> s;

bool check(int j,int cnt);

int main(void)
{
    int n;
    int cnt;
    
    scanf("%d",&n);
    b[1]=1;
    b[2]=2;
    s.insert(3);
    cnt=3;
    
    for (int j=3;cnt<=n;++j)
    {
        if (check(j,cnt))
        {
            b[cnt]=j;
            for (int k=1;k<=cnt-1;++k) s.insert(j+b[k]);
            ++cnt;
        }
    }
    
    if (n==2) printf("1 1");
    else
    {
        printf("%d",b[1]);
        for (int i=2;i<=n;++i) printf(" %d",b[i]);
    }
}

bool check (int j,int cnt)
{
    for (int i=1;i<=cnt-1;++i)
    {
        if (s.count(b[i]+j)) return false;
    }
    return true;
}

 

 

以上是关于CDOJ 1262 Memory的主要内容,如果未能解决你的问题,请参考以下文章

cdoj1588 潘爷泡妹

CDOJ 876 爱管闲事

CDoj--Search gold(dp)

cdoj1324暴力分块

CDOJ 1962 ?????????vs?????????2???????????????

cdoj 1489 老司机采花