zoukankan      html  css  js  c++  java
  • BZOJ 1634 [Usaco2007 Jan]Protecting the Flowers 护花:贪心【局部分析法】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1634

    题意:

      约翰留下他的N只奶牛上山采木。可是,当他回来的时候,他看到了一幕惨剧:牛们正躲在他的花园里,啃食着他心爱的美丽花朵!

      为了使接下来花朵的损失最小,约翰赶紧采取行动,把牛们送回牛棚。

      第i只牛所在的位置距离牛棚t[i](1 <= t[i] <= 2000000)分钟的路程,而在约翰开始送她回牛棚之前,她每分钟会啃食e[i](1 <= e[i] <= 100)朵鲜花。

      无论多么努力,约翰一次只能送一只牛回棚。而运送第第i只牛事实上需要2Ti分钟,因为来回都需要时间。

      写一个程序来决定约翰运送奶牛的顺序,使最终被吞食的花朵数量最小。

    题解:

      贪心。

      对于顺序相邻的两只牛a和b,交换a和b的顺序,对于a和b之外的牛是没有影响的。

      将其他的牛看作一只牛c。

      当a排在b之前时,答案为:

        ans1 = t[a]*(e[b]+e[c]) + t[b]*e[c]

      当b排在a之前时,答案为:

        ans2 = t[b]*(e[a]+e[c]) + t[a]*e[c]

      假设a排在b前面的时候答案更优,则有:

        ans1 < ans2

        即:t[a]*(e[b]+e[c]) + t[b]*e[c] < t[b]*(e[a]+e[c]) + t[a]*e[c]

        整理得:t[a]*e[b] < t[b]*e[a]

      所以按照t[a]*e[b] < t[b]*e[a]排序就好了。

    AC Code:

     1 // before: t[a]*(e[b]+e[c]) + t[b]*e[c]
     2 // after:  t[b]*(e[a]+e[c]) + t[a]*e[c]
     3 // if a is better:
     4 // t[a]*(e[b]+e[c]) + t[b]*e[c] < t[b]*(e[a]+e[c]) + t[a]*e[c]
     5 // t[a]*e[b] + t[a]*e[c] + t[b]*e[c] < t[b]*e[a] + t[b]*e[c] + t[a]*e[c]
     6 // t[a]*e[b] < t[b]*e[a]
     7 #include <iostream>
     8 #include <stdio.h>
     9 #include <string.h>
    10 #include <algorithm>
    11 #define MAX_N 100005
    12 
    13 using namespace std;
    14 
    15 struct Cow
    16 {
    17     int eat;
    18     int tim;
    19     Cow(int _eat,int _tim)
    20     {
    21         eat=_eat;
    22         tim=_tim;
    23     }
    24     Cow(){}
    25     friend bool operator < (const Cow &a,const Cow &b)
    26     {
    27         return a.tim*b.eat<b.tim*a.eat;
    28     }
    29 };
    30 
    31 int n;
    32 long long ans=0;
    33 Cow cow[MAX_N];
    34 
    35 void read()
    36 {
    37     cin>>n;
    38     for(int i=0;i<n;i++)
    39     {
    40         cin>>cow[i].tim>>cow[i].eat;
    41         cow[i].tim<<=1;
    42     }
    43 }
    44 
    45 void solve()
    46 {
    47     sort(cow,cow+n);
    48     int tot=0;
    49     for(int i=0;i<n;i++)
    50     {
    51         tot+=cow[i].eat;
    52     }
    53     for(int i=0;i<n;i++)
    54     {
    55         tot-=cow[i].eat;
    56         ans+=cow[i].tim*tot;
    57     }
    58 }
    59 
    60 void print()
    61 {
    62     cout<<ans<<endl;
    63 }
    64 
    65 int main()
    66 {
    67     read();
    68     solve();
    69     print();
    70 }
  • 相关阅读:
    spring 循环依赖问题
    spring data jpa 关键字 命名
    mongodb 添加字段并设置默认值
    java mongoTemplate的group统计
    java8 从对象集合中取出某个字段的集合
    springboot12-zuul
    springboot11-01-security入门
    springboot项目怎么部署到外部tomcat
    springboot10-springcloud-eureka 服务注册与发现,负载均衡客户端(ribbon,feign)调用
    UML
  • 原文地址:https://www.cnblogs.com/Leohh/p/7624502.html
Copyright © 2011-2022 走看看