问题 B: 奎奎发红包
时间限制: 1 Sec 内存限制: 128 MB
提交: 2489 解决: 390
[状态] [提交] [命题人:外部导入]
题目描述
情人节又到了,又到了一年一度发红包的时间。经大家研究决定,今年让奎奎自愿发红包。
俱乐部有n个人(0<n<100000),每个人都有一个单身值v[i]与亲密度t[i](0≤v[i]≤10000,0≤t[i]≤10000),单身值越大的人,在情人节的时候就越羡慕奎奎,奎奎就需要给他更大的红包来安慰他。 由于一个寒假没有见到奎奎,领红包的时候大家都想跟奎奎py,花费时间t[i],先py后给红包噢。
大家都厌倦了等待,如果一个人等了时间t,那么奎奎发给他的红包大小就是v[i]·t。
但是奎奎还要和女朋友去快乐,想要花最少的钱来满足大家。
请你帮他计算最少需要发多少钱的红包。
输入
第一行一个整数n。接下来n行,每行两个数v[i]和t[i]。
输出
一个整数表示答案。
样例输入 Copy
4
1 4
2 3
3 2
4 1
样例输出 Copy
35
题意:略
思路:按v / t比值从大到小排序,注意0的存在,u1s1,我没有管0也A了?但是多组样例输入就WA了?
有没有人告诉我为什么加上多组样例输入就WA??????????
三个人死磕了3小时再见吧您 为了净化我的博客我还是别写脏话了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10;
struct node
{
int v, t;
double k;
} s[N];
bool cmp(node x, node y)
{
return x.k > y.k;
}
int main()
{
int n, tot = 0, vv, tt;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
{
scanf("%d%d", &vv, &tt);
if(vv && tt)
{
tot++;
s[tot].v = vv;
s[tot].t = tt;
s[tot].k = 1.0 * vv / tt;
}
}
sort(s + 1, s + tot + 1, cmp);
ll ans = 0;
ll t = 0;
for(int i = 1; i <= tot; ++i)
{
t += (ll)s[i].t;
ans += (ll)s[i].v * t;
}
cout<<ans<<'\n';
return 0;
}