考试T1护花

传送门

这题的提议似乎有什么问题,只要约翰选好了要抓那头牛,他就不会吃草了,站在原地傻等?

这题就是贪心,但在用cmp中比较单位时间吃草数量时,要用double型,不然可能会有点一样。。。

还有就是主要的思路


设x,y是两头牛,如果后送y牛损失的花少于后送x牛损失的花

即x.t*x.d+(x.t+y.t)*y.d<=y.t*y.d+(x.t+y.t)*x.d

打开可化简为x.t*y.d<=y.t*x.d

∴x.d/x.t>=y.d/y.t时选择先送x牛

所以按每头牛吃的花和时间的比从大到小排序的顺序处理就好啦

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define Maxn 100001
 4 struct hhh{int d,t;}cow[Maxn];
 5 bool cmp(hhh x,hhh y){return (float)x.d/(float)x.t>=(float)y.d/(float)y.t;}
 6   
 7 long long ans,T;
 8 int n;
 9 int main()
10 {
11     scanf("%d",&n);
12     for(int i=1;i<=n;i++)    scanf("%d %d",&cow[i].t,&cow[i].d);
13     std::sort(cow+1,cow+1+n,cmp);
14     for(int i=1;i<=n;i++)
15     {
16         ans+=T*cow[i].d;
17         T+=cow[i].t*2;
18     }
19     printf("%lld",ans);
20     return 0;
21 }

 据说不用std标准库,而在使用时用std::不仅高端大气上档次,还会快一点。。。

原文地址:https://www.cnblogs.com/2529102757ab/p/11122645.html