小x和小h是好盆友,小h从小体弱多病,而且还非常健忘,于是把自己平时吃的n瓶药都给小x等人保管。
某一天由于雾都的pm2.5爆表,小h的慢性呼吸道疾病又发作了,但当小x掏出药瓶的时候,却发现了异常情况。
小x现在有n瓶药,每瓶药里面有无限个药片,每片药重量严格等于1克。但是,吹毛求疵的小x发现n瓶药中有2瓶药的每一片药片在重量上是不合格的,不合格的药片比正常药片轻0.1g。
小x现在有一个电子称(能够显示具体重量),由于时间紧急,小x决定从每瓶药中选择bi(1≤bi)个药片,称量它们的总和,并且只称一次,从而找出这两瓶不合格药的编号。
现在,请问最小字典序的序列b(由bi构成)是多少?
Input
一行一个整数n(2≤n≤52)
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; }
时间: 2024-12-20 16:52:41