UESTC Memory 1262 (打表&暴力模拟)

40 篇文章 1 订阅
25 篇文章 0 订阅

Memory

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

小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 and output

Sample Input Sample Output
3
1 2 3

Hint

若  a1,a2..an  比  b1,b2..bn  字典序小,则必存在  j(1jn)  使得  aj  <  bj  且 对于所有 i<j 都有 ai=bi

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

Source

//直接暴力打表。。

<pre class="cpp" name="code">#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int v[6000];
int a[55]={0,1,2,3,5,8,13,21,30,39,53,74,95,128,152,182,212,258,316,
374,413,476,531,546,608,717,798,862,965,1060,1161,1307,1386,1435,1556,
1722,1834,1934,2058,2261,2497,2699,2874,3061,3197,3332,3629,3712,3868,
4140,4447,4640,5022};
int main()
{
	int n,i,j,k;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==2)
			printf("1 1\n");
		else
		{
			for(i=1;i<n;i++)
				printf("%d ",a[i]);
			printf("%d\n",a[n]);
		}
	}
	return 0;
}
//下面的是打表:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int sum[55][55];
int a[55]={0,1,2,3,5,8};
int judge(int x,int y)
{
	int i,j,k;
	for(i=1;i<x;i++)
	{
		sum[x][i]=a[i]+y;
		for(j=1;j<x;j++)
		{
			for(k=1;k<x;k++)
			{
				if(sum[x][i]==sum[j][k])
					return 0;
			}
		}
	}
	return 1;
}
int main()
{
	int n,i,j,k;
	sum[1][2]=3;sum[1][3]=4;sum[2][3]=5;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==2)
			printf("1 1\n");
		else
		{
			printf("1");
			for(i=2;i<4;i++)
				printf(" %d",a[i]);
			for(i=4;i<=n;i++)
			{
				a[i]=a[i-1]+1;
				for(j=a[i];;j++)
				{
					if(judge(i,j))
					{
						a[i]=j;
						printf(" %d",j);
						break;
					}
				}
			}
			printf("\n");
		}	
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值