H. 保护花

农民约翰去砍一些木头,并留下N(2 = N = 100,000)奶牛吃草,像往常一样。当他回来时,他惊恐地发现,成群的奶牛正在他的花园里吃着他美丽的花。为了尽量减少随后的损害,FJ决定立即采取行动,将每头牛运回自己的谷仓。

每头牛是在一个位置,是TⅠ分钟(1 =TⅠ• 2,000,000)远离自己的谷仓。此外,在等待运输时,她破坏DⅠ(1 |DⅠ• 每分钟 100) 朵花。不管他多么努力,FJ只能一次把一头牛运回她的谷仓。将牛i移动到它的谷仓需要2 |TⅠ分钟(TⅠ到那里,TⅠ返回)。FJ从花场开始,把牛运到谷仓,然后走回花场,没有多余的时间去下一头需要运输的奶牛。

编写一个程序来确定 FJ 应该拾起奶牛的顺序,以便将销毁的花的总数降至最低。

输入

行 1:单个整数N
第 2 行。N+1:每行包含两个空格分隔的整数,TⅠDⅠ,描述单头牛的特征

输出

行 1:单个整数,即销毁的花的最小数量

示例输入

6
3 1
2 5
2 3
3 2
4 1
1 6

样本输出

86

 这个题的要点有两个,一个是如何确定先顺走哪头牛,另一个是贪心算法。

这个题坑就坑在,距离和速度不能分开考虑并且他的数据输出很大很大!!!

题里说了,时间在两百万分钟内,速度一百以内,所以最后的数据很大很大;

这时候你就要把数据类型定义成longlong

速度/距离的比值越大,你就应该越先把它带回去,另外因为数据很大,避免超时

你要尽量简化运算过程,使代码简洁。先贴上我的

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
struct Cow{
	long long int a,b;
}c[100000];
bool cmp(Cow x,Cow y){
	return 1.0*x.b/x.a>1.0*y.b/y.a;
}
int main(){
    int n;
    scanf("%d",&n);
    long long int s=0;
    for(int i=0;i<n;i++){
    	scanf("%d%d",&c[i].a,&c[i].b);
    	s+=c[i].b;
	}
	sort(c,c+n,cmp);
	long long int res=0,sum=0;
	while(res!=n){
		s-=c[res].b;
		sum+=2*c[res].a*s;
		res++;
	}
	printf("%lld",sum);
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值