http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1011&cid=832
In the world line 1.048596%
梓川咲太在解决了樱岛麻衣和丰浜和花互换身体的事件以后,又陷入到了新的麻烦里面。
......
“你们真的在交往吗?”
“是的,这是事实。”
樱岛麻衣即使有点不好意思,也依然坦诚真相。
“对方是个没神经的男生,三个月前向着全校学生向我表白。那个......”,麻衣以害羞的表情慎选言辞“我虽然一度保留,但还是被他的毅力折服了。”
记者们一连串的发问都被樱岛麻衣轻松的化解,明明是新电影发布会的现场,可是记者们对樱岛麻衣的发问却没有平息的征兆。
在一旁看着的经纪人——凉子小姐心有余悸。明星的恋爱一直是禁忌的话题,稍有差池就会断送艺人生涯。但是眼前的樱岛麻衣却能借助发布会的现场,把气氛往有利于自己的方向发展。
这自然和樱岛麻衣本身超高的交流技巧有关,还和观众有关。
“如果有话要对男朋友说,可以请您在这里说吗?”提出请求而不是询问的记者是南条文香,和梓川咲太认识,一直在追踪调查“青春期症候群”。
“不要,我要当面和他说。”樱岛麻衣难为情的笑了,那是有点害羞又有非常幸福,能烙印在灵魂深处的表情,她以这样一句话作为话题的结束。
发布会后,凉子小姐看到事情的局面发展如此顺利,想起了那天晚上樱岛麻衣小姐和她的面谈。
“对于气氛的引导”,樱岛麻衣在凉子小姐前正襟危坐“我需要过半数的记者支持我。”
“怎么界定这个支持呢?”
“记者对于明星恋爱能不能正面的报到,这个是最重要的。你的电脑里面也有关于记者的各种资料吧。拿来给我看一下。”
樱岛麻衣接过凉子小姐的电脑,熟练的打开excel,进行了一番操作以后,又把电脑给了凉子小姐。
“每个记者都有{00,10,01,11}四个数字其中的一个,还有一个数字,指的是这个记者的影响力。”
“两个观念A和B,0代表不支持,1代表支持。南条文香记者的右边是11,表示的是即支持A又支持B。而这个记者的右边是01,说明不支持A但支持B。00的话说明两个都不支持。”
“凉子小姐,你能不能帮我建立这个一个名单,人数不限,这上面的记者既有超过半数的人支持A,又有超过半数的人支持B。而且这个名单的人的总影响力最大?”
凉子小姐开始打开Visual Studio 2017。她知道这个问题只能用程序来解决,也将决定樱岛麻衣的艺人生涯。
Input
多组输入输出
第一行一个整数n,表示有n个记者(1<=n<=400000)
接下来n行,每行有两个数。
第一个数是{00,01,10,11}的其中一个,表示第i个记者的支持取向。
第二个数是ai (0<=ai<5000),表示第i个记者的影响力。
所有测试数据的n的和不超过500000
Output
输出一个数字,表示能取得的最大的总影响力
Sample Input
5
11 1
01 1
00 100
10 1
01 1
Sample Output
103
C++版本一
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
using namespace std;
typedef long long ll;
const int N=100000+10;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
vector<int> v[4];
bool cmp(int x, int y){
return x > y;
}
int main()
{
#ifdef DEBUG
freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
#endif
int n, op,m;
while(~scanf("%d", &n)){
for(int i = 0; i < 4; ++i)
v[i].clear();
ll ans = 0;
for(int i = 1; i <= n; ++i){
scanf("%d%d", &op, &m);
if(op == 11) {v[0].push_back(m);ans+=m;}
if(op == 10) v[1].push_back(m);
if(op == 1) v[2].push_back(m);
if(op == 0) v[3].push_back(m);
}
for(int i = 1; i < 3; ++i)
sort(v[i].begin(), v[i].end(), cmp);
int t1 = min(v[1].size(), v[2].size());
for(int i = 0; i < t1; ++i){
ans += v[1][i] + v[2][i];
}
for(int i = t1; i < v[1].size(); ++i)
v[3].push_back(v[1][i]);
for(int i = t1; i < v[2].size(); ++i)
v[3].push_back(v[2][i]);
sort(v[3].begin(), v[3].end(), cmp);
int num = v[0].size();
for(int i = 0; i < num && i < v[3].size(); ++i){
ans += v[3][i];
}
printf("%lld\n", ans);
}
//cout << "Hello world!" << endl;
return 0;
}