poj 2709 Painter (贪心)

 //需要n中普通原料和g ml灰色原料
//每三种不同普通原料各x ml 可以合成 x ml 灰色原料
//问最少需要集组原料 每组各原料50 ml
# include <stdio.h>
# include <algorithm>
# include <string.h>
using namespace std;
int main()
{
	int i,n,cot,g,a[15],g1,b[15];
	while(~scanf("%d",&n),n)
	{
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		   b[i]=a[i];
		}
		scanf("%d",&g);
		sort(a,a+n);
		sort(b,b+n);
		if(a[n-1]%50==0)//满足普通原料的最少组数
			cot=a[n-1]/50;
		else
			cot=a[n-1]/50+1;
		 for(i=0;i<n;i++)//剩下去合成灰色原料的数量
		 {
			 a[i]=cot*50-a[i];
			 b[i]=a[i];
		 }
		while(1)
		{
			g1=g;
			for(i=n-1;;)
			{
				sort(b,b+n);
				if(b[i]>0&&b[i-1]>0&&b[i-2]>0)
				{
					g1--;
					b[i]--;
					b[i-1]--;
					b[i-2]--;
				}
				else
					break;
				if(g1<=0)
				{
					break;
				}
			}
			if(g1<=0)
			{
				printf("%d\n",cot);
				break;
			}
			cot++;
			for(i=0;i<n;i++)//不够加一组
			{
				a[i]+=50;
				b[i]=a[i];
			}
		}
	}
	return 0;
}

时间: 2024-10-25 11:59:55

poj 2709 Painter (贪心)的相关文章

POJ—2709—Painter—【贪心】

Painter Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3157   Accepted: 1962 Description The local toy store sells small fingerpainting kits with between three and twelve 50ml bottles of paint, each a different color. The paints are bri

poj 1456 Supermarket (贪心+并查集)

# include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int fa[10010]; struct node { int p; int d; }; struct node a[10010]; bool cmp(node a1,node a2)//利润从大到小 { return a1.p>a2.p; } int find(int x) { if(fa[x]

POJ 1681 Painter&#39;s Problem (高斯消元)

题目地址:POJ 1681 跟前两题几乎一模一样的...不多说了.高斯消元+自由元枚举. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #include &

POJ 1862 Stripies 贪心+优先队列

http://poj.org/problem?id=1862 题目大意: 有一种生物能两两合并,合并之前的重量分别为m1和m2,合并之后变为2*sqrt(m1*m2),现在给定n个这样的生物,求合并成一个的最小重量 思路: m1+m2 >=  2*sqrt(m1*m2) 所以每次取大的去合并,能变小. 直接优先队列就可以啦. #include<cstdio> #include<cmath> #include<queue> using namespace std;

POJ 1681 Painter&#39;s Problem (高斯消元)

题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要染几次?  若 不能 染成 输出 inf. 分析: 和1222差不多,唯一的区别是这个题还要求 最短的步数,其实只需要枚举一下最后的x[][]是否为1,即是否需要按下, 由于只有无解或者解唯一,因为按的顺序是没有影响的,所以只要是有解一定唯一,而且最短的情况是每个格子只按一次, 因为按两次以后就变为

poj 2431 Expedition 贪心+最大堆

当油量不够时从走过的油站中选最大加油量的 #include<iostream> #include<queue> #include<stdlib.h> #include<algorithm> using namespace std; #define MAX_N 10005 struct node{ int dist,fuel; }t[MAX_N]; bool cmp(const node &a,const node &b) { return a

poj 1681 Painter&amp;#39;s Problem(高斯消元)

http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. 注意依据自由变元求其它解及求最优值的方法. #include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include

POJ 1681 Painter&#39;s Problem 【高斯消元 二进制枚举】

任意门:http://poj.org/problem?id=1681 Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7667   Accepted: 3624 Description There is a square wall which is made of n*n small square bricks. Some bricks are white while some bric

poj 3298 Antimonotonicity 贪心

题意: 求一个序列的最大子序列,该子序列满足:a1>a2<a3>a4...... 分析: 贪心,从极大值起交替取这个序列中极小值.极大值. 代码: //poj 3298 //sep9 #include <iostream> using namespace std; const int maxN=30024; int a[maxN]; int main() { int cases; scanf("%d",&cases); while(cases--)