首页 > 技术文章 > Memory

littlepear 2016-08-18 22:50 原文

A - Memory
Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu

Description

小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个数字,两两间用空格隔开,注意结尾没有空格。

Sample Input

3

Sample Output

1 2 3

 

直接暴力即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
using namespace std;
int a[60];
map<int,int> vis;
int main()
{
    int n;
    scanf("%d",&n);
    a[1] = 1;
    a[2] = 2;
    vis[3] = 1;
    if(n==2) printf("1 1\n");
    else
    {
       for(int i=3;i<=n;i++)
       {
           int flag = 0;
           for(int j=a[i-1]+1;j<=10050&&!flag;j++)
           {
               int temp = j;
               int flag1 = 0;
               for(int k=1;k<i;k++)
               {
                   if(vis[temp+a[k]])
                   {
                       flag1 = 1;
                       break;
                   }
               }
               if(!flag1)
               {
                   for(int k=1;k<i;k++)
                   {
                       vis[temp+a[k]] = 1;
                   }
                   flag = 1;
                   a[i] = temp;
               }
           }
       }
       printf("%d",a[1]);
       for(int i=2;i<=n;i++) printf(" %d",a[i]);
       printf("\n");
    }
    return 0;
}

 

推荐阅读