算法设计与分析 4.2 洪尼玛与网络攻防战

★题目描述

有n名黑客袭击了他公司的账户,第i名黑客每分钟可以从账户中盗取ci元,对付第i名黑客需要2*ti时间

一旦洪尼玛对第i名黑客开始进行攻防,该黑客将无法继续盗取钱财,但其他未被攻防的黑客可以继续盗取钱财。

这n名黑客从第0时刻开始进行袭击。洪尼玛想知道对付完这n名黑客后被盗取的金额最小是多少?

★输入格式

第一行为一个正整数n,表示黑客的数量;

接下来n行,每行两个正整数ci、ti,表示第i名黑客;

对于60%的数据,1<=n<=103;

对于100%的数据,1<=n<=105、1<=ci、ti<=103。

★输出格式

输出一个正整数,表示被盗取的最小金额。

★样例输入

5
1 1
2 2
3 3
4 4
5 5

★样例输出

170

★提示

/*
根据 ci/ti 排序
*/
#include<bits/stdc++.h>
using namespace std;
int ID[100005], C[100005], T[100005];
long long ans=0, res=0; 
int n;

bool cmp(const int a, const int b){
	return C[a]*T[b] > C[b]*T[a];
}

int main(){
	scanf("%d",&n);
	for(int i=0; i<n; ++i){
		scanf("%d%d", &C[i], &T[i]);
		ID[i]=i;
		ans+=C[i];
	}
	
	sort(ID, ID+n, cmp);
	
	for(int i=0; i<n; ++i){
		ans-=C[ID[i]];
		res+=ans*T[ID[i]]*2;
	}
	printf("%lld\n",res);
	return 0;
}

posted on 2019-12-18 20:14  yejifeng  阅读(805)  评论(0编辑  收藏  举报

导航