【考题总结3】贪心+优化(挤奶)

  题目描述

农夫约翰发现,当他的奶牛在附近有另一头奶牛获得其他奶牛支持时候,他就更容易挤牛奶了。因此,他想把他的M头奶牛(M < 1000000000,M是        偶数)分割为M/2对。然后,每一对将被引到谷仓里的一个单独的小隔间里挤奶。每一个隔间的挤牛奶将同时进行。

让事情变得有点复杂的是,每一个农夫约翰的奶牛都有不同的产奶量。如果奶牛产奶量是A和B,那么就需要用A+B的时间来给它们挤奶。

请帮助农场主约翰确定整个挤奶过程所需的最短时间。

  输入格式

第一行为N(1

  输出格式

输出整个过程的最短时间。

  样例数据

input

3 
1 8
2 5
1 2

output

10

样例说明:这里 4头奶牛的产奶量为2,5,5,8。显然,将他们分为2+8 和5+5所需的时间最短(其他任意分配都会导致有一组奶牛的时间超过             10),所需时间为10



大致思路:

1.将奶牛的产奶量从小到大(或从大到小)进行排序:因为要所需时间最短,也就是所求得的结果最小,那么就因该最小的和最大的进行组合,然后将组合数最大的为最终结果输出

2.因为买一组的数据中有多组奶牛,且产奶的时间各不相同,所以要用结构体读入,然后再用sort函数按照产奶时间进行从小到大排序。

3.然后从小(即数组的最左边,变量为l)到大(r)进行组合,然后最后的结果是最大的组合数。但是一个一个组合会有一个问题:超时。所以要进行一些语句的优化


即:a.如果第l头牛的挤奶时间和第r头牛的挤奶时间是一样的话就i++,r--.因为可以减少多次重复,没用的判断.

b.如果第l头牛的挤奶时间小于第r头牛得挤奶时间,则l++,第i头牛的牛的数量减去第l头牛的牛的数量.

c.判断第l头牛得挤奶时间大于第i头牛得挤奶时间,处理方法与第b种情况的处理方法正好相反.


程序如下:

#include 
using namespace std;
struct cow
{
	int x;
	long long y;
}a[200000];//定义结构体
	int n;
bool sort_p(cow a,cow b)
    {
        return (a.y<b.y);
    }//结构体的排序函数
int main()
{
	cin>>n;
	for (int i=1;i<=n;i++) 
	  cin>>a[i].x>>a[i].y;
	sort(a+1,a+n+1,sort_p);
	int l=1,r=n;
	long long large=-1;
	for (;l<=r;)
	{
		if (a[r].y+a[l].y>large) large=a[l].y+a[r].y;//判断最大值
		if (a[l].x<a[r].x) 
		{
			a[r].x-=a[l].x;
			l++;
		}
		else
		if (a[l].x>a[r].x)
		{
			a[l].x-=a[r].x;
			r--;
		}
		else
		if (a[l].x==a[r].x)
		{
			l++;r--;
		}//以上为上述的a,b,c的优化程序
	}
	cout<<large;//输出最大值
	return 0;
}



你可能感兴趣的:(【考题总结3】贪心+优化(挤奶))