閱讀361 返回首頁    go 阿裏雲 go 技術社區[雲棲]


POJ-3262-Protecting the Flowers

Protecting the Flowers
Time Limit: 2000MS  Memory Limit: 65536K
Total Submissions: 4237  Accepted: 1710

Description

Farmer John went to cut some wood and left N (2 ≤ N ≤ 100,000) cows eating the grass, as usual. When he returned, he found to his horror that the cluster of cows was in his garden eating his beautiful flowers. Wanting to minimize the subsequent damage, FJ decided to take immediate action and transport each cow back to its own barn.

Each cow i is at a location that is Ti minutes (1 ≤ Ti ≤ 2,000,000) away from its own barn. Furthermore, while waiting for transport, she destroys Di (1 ≤ Di ≤ 100) flowers per minute. No matter how hard he tries, FJ can only transport one cow at a time back to her barn. Moving cow i to its barn requires 2 × Ti minutes (Ti to get there and Ti to return). FJ starts at the flower patch, transports the cow to its barn, and then walks back to the flowers, taking no extra time to get to the next cow that needs transport.

Write a program to determine the order in which FJ should pick up the cows so that the total number of flowers destroyed is minimized.

Input

Line 1: A single integer N
Lines 2..N+1: Each line contains two space-separated integers, Ti and Di, that describe a single cow's characteristics
Output

Line 1: A single integer that is the minimum number of destroyed flowers
Sample Input

6
3 1
2 5
2 3
3 2
4 1
1 6
Sample Output

86
Hint

FJ returns the cows in the following order: 6, 2, 3, 4, 1, 5. While he is transporting cow 6 to the barn, the others destroy 24 flowers; next he will take cow 2, losing 28 more of his beautiful flora. For the cows 3, 4, 1 he loses 16, 12, and 6 flowers respectively. When he picks cow 5 there are no more cows damaging the flowers, so the loss for that cow is zero. The total flowers lost this way is 24 + 28 + 16 + 12 + 6 = 86.
Source

USACO 2007 January Silver

 

 

題意:
有n個牛在FJ的花園亂吃。

所以FJ要趕他們回牛棚。

每個牛在被趕走之前每秒吃Di個花朵。趕它回去FJ來回要花的總時間是Ti×2。在被趕走的過程中,被趕走的牛就不能亂吃

思路:
貪心策略,對牛進行排序,排序的標準是,假設牛A與牛B要選一頭趕走,我們首先要選擇破壞最大的一頭牛趕走,留破壞小
的牛。他們的破壞著呢麽計算呢?假設先趕走牛A,那麼牛B造成的損失是2×TA×DB,先趕走牛B,那麼牛A造成的損失是2×TA×DB,
所以,隻要判斷TA×DB與TA×DB誰大,就知道該先趕走誰了,所以數組排序的標準就是---Ti×Dj>Tj×Di

AC代碼:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define INF 0x11111110
using namespace std;
struct node
{
   __int64 x;
   __int64 y;      
}a[100010];
int cmp(node n,node m)
{
   return n.y*m.x>m.y*n.x;
}
int main()
{
    int i,j,n;
    __int64 sum,num;
    while(scanf("%d",&n)!=EOF)
    {
        sum=0;
        memset(a,0,sizeof(a));
        for(i=0;i<n;i++)
        {
            scanf("%I64d %I64d",&a[i].x,&a[i].y);
            sum+=a[i].y;
        }
        sort(a,a+n,cmp);
        num=0;
        for(i=0;i<n;i++)
        {
           sum-=a[i].y;
           num+=sum*(a[i].x*2);
        }
        printf("%I64d\n",num);
    }
    return 0;
}

最後更新:2017-04-03 05:39:40

  上一篇:go Cocos2d-x中使用音頻CocosDenshion引擎介紹與音頻文件的預處理
  下一篇:go PHP引用操作以及外部操作函數的局部靜態變量的方法