【暴搜】中山纪念中学暑期游Day2——佳肴

前言

考的不好,但是评讲过后发现:都!好!水!啊!【暴搜】中山纪念中学暑期游Day2——佳肴_第1张图片

还是那句自己的老话:

 

题目

 佳肴就是非常美味的菜的意思,佳肴最关键的是选择好原料。
  现在有N种原料,每种原料都有酸度S和苦度B两个属性,当选择多种原料时,总酸度为每种原料的酸度之积,总苦度为每种原料的苦度之和。
  正如大家所知,佳肴是既不酸也不苦的,因为要保证所选的原料使得总酸度和总苦度差的绝对值最小。
  由于佳肴不能只有水,所以必须至少选择一种佳肴。

Input

  输入第一行包含一个整数N(1<=N<=10),表示原料的种数。
  接下来N行每行包含两个用一个空格隔开的整数,分别表示酸度和苦度。
  输入数据保证如果所有原料都选上,总酸度和总苦度不会超过10^9。

Output

  输出总酸度和总苦度最小的差。

Sample Input

输入1:
1
3 10

输入2:
2
3 8
5 8

输入3:
4
1 7
2 6
3 8
4 9

Sample Output

输出1:
7

输出2:
1

输出3:
1

样例解释

样例3中选择最后三种原料,这样总酸度为2×3×4=24,总苦度为6+8+9=23,差为1。

分析

因为数据范围:1<=N<=10,最多才2^n=1024种情况——>直接暴搜,每个佳肴取或不取

(这次过后发现...连暴搜写丑了都是过不了的呜呜呜呜...)

考试时写丑了只有五十几分的代码

#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;//记得开ll 
const int MAXN=10;//n至多才10?有蹊跷... 
ll n,ans=1e9+7;
struct node
{
	ll x,y;
}a[MAXN+5];
void dfs(int id,ll tot1,ll tot2,int f)//f:是否有至少一个佳肴 
{
	if(id>n+1)
		return ;
	if(f!=0)
		ans=min(ans,abs(tot1-tot2));
	for(int i=id+1;i<=n;i++)
	{
		//下一个要选 
		if(!f)
			dfs(id+1,a[i].x,tot2+a[i].y,1);
		else
			dfs(id+1,tot1*a[i].x,tot2+a[i].y,1);
		//下一个不选 
		if(!f)
			dfs(id+1,tot1,tot2,0);
		else
			dfs(id+1,tot1,tot2,1);
	}
}
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld%lld",&a[i].x,&a[i].y);
	dfs(1,0,0,0);
	dfs(1,a[1].x,a[1].y,1);
	printf("%lld\n",ans);
	return 0;
}

AC代码

#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int MAXN=10;
ll n,ans=0x3f3f3f3f3f;
struct node
{
	ll x,y;
}a[MAXN+5];
void dfs(int id,ll tot1,ll tot2)
{
	ans=min(ans,abs(tot1-tot2));
	for(int i=id+1;i<=n;i++)
		dfs(i,tot1*a[i].x,tot2+a[i].y);
}
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld%lld",&a[i].x,&a[i].y);
	for(int i=1;i<=n;i++)
		dfs(i,a[i].x,a[i].y);
	printf("%lld\n",ans);
	return 0;
}

 

你可能感兴趣的:(搜索,暴力)