考试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::不仅高端大气上档次,还会快一点。。。