UESTC 1262: Memory【模拟】

 Memory
Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu
Submit  Status  Practice  UESTC 1262
Appoint description:  System Crawler  (2016-01-24)

Description

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

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

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

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

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

Input

一行一个整数

Output

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

Sample Input

3

Sample Output

1 2 3

Hint

若   比   字典序小,则必存在   使得   <   且 对于所有 都有

样例的解释:如果称出来是5.7g,那么就是第1和第2瓶不合格;如果是5.6g,那么就是第1和第3瓶不合格;如果是5.5g,那么就是第2和第3瓶不合格。

AC-code:

#include<cstdio>
int dp[55]={0,1,2,3,5};
int a[55][55];
int judge(int x,int y)
{
	int i,j,k;
	for(i=1;i<x;i++)
	{
		a[x][i]=dp[i]+y;
		for(j=1;j<x;j++)
			for(k=1;k<x;k++)
				if(a[x][i]==a[j][k])
					return 0;
	}
	return 1;
}
int main()
{
	int n,i,j;
	a[1][2]=3;a[2][3]=5;a[3][5]=8;
	scanf("%d",&n);
	if(n==2)
		printf("1 1\n");
	else
	{
		printf("1");
		for(i=2;i<4;i++)
			printf(" %d",dp[i]);
		for(i=4;i<=n;i++)
		{
			dp[i]=dp[i-1]+1;
			for(j=dp[i];;j++)
				if(judge(i,j))
				{
					dp[i]=j;
					printf(" %d",j);
					break;
				}
		}
		printf("\n");
	}
	return 0;
 } 


你可能感兴趣的:(思维)