一道挤奶的奶牛题的题解

来源:互联网 发布:云图制作软件 编辑:程序博客网 时间:2024/06/09 17:00

  题目描述

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

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

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

  输入格式

第一行为N(1<N<100 000) 接下来的N行每一行都有两个整数x,y,表示有x头奶牛的产奶量为y(1≤y≤1,000,000,000)。x的和是整数M。

  输出格式

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

  样例数据

input

3 1 82 51 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 <bits/stdc++.h>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++;}elseif (a[l].x>a[r].x){a[l].x-=a[r].x;r--;}elseif (a[l].x==a[r].x){l++;r--;}//以上为上述的a,b,c的优化程序}cout<<large;//输出最大值return 0;}



原创粉丝点击