2014_acmicpc_shanghai_google
I http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84975#problem/I
题意:我方有n个士兵,敌方有m个士兵,每个士兵有攻击力和防御力,我方一个兵只能选择对方一个兵去战斗,即使我方幸存了也不能再去和别的敌人战斗,一场战斗中防御力小于等于对方攻击力的兵会死,我们需要选出一个方案使得杀死对面所有兵,且我们存活的兵尽量多。
解法:先把我军按照攻击力从大到小排序,敌军按照防御力从大到小排序,然后依次枚举敌军士兵,对每个敌军士兵,我们把攻击力大于等于其防御力的都存到map中,存我军的防御力。map中的都一定能杀死对手。所以我们在map中二分出第一个防御力大于敌军攻击力的,那么选择他可以使得幸存的人数多一个,并且防御力最节省。贪心。
//#define txtout
//#define debug
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int M=1e5+;
map<int,int> mp;
map<int,int>::iterator it;
struct G{
int attack,defense;
}our[M],his[M];
int n,m;
bool cmp_defense_de(const G &a,const G &b){
return a.defense>b.defense;
}
bool cmp_attack_de(const G &a,const G &b){
return a.attack>b.attack;
}
int solve(){
sort(our,our+n,cmp_attack_de);
sort(his,his+m,cmp_defense_de);
mp.clear();
int our_id=;
int result=;
for(int i=;i<m;i++){
while(our_id<n&&our[our_id].attack>=his[i].defense){
mp[our[our_id].defense]++;
our_id++;
}
if(mp.empty()) return -;
it=mp.upper_bound(his[i].attack);
if(it==mp.end()){
it=mp.begin();
}
else{
result++;
}
if(it->second==){
mp.erase(it);
}
else{
mp[it->first]--;
}
}
result+=n-our_id;
for(it=mp.begin();it!=mp.end();it++){
result+=it->second;
}
return result;
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // txtout
int t;
while(~scanf("%d",&t)){
int cas=;
while(t--){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){
scanf("%d%d",&our[i].attack,&our[i].defense);
}
for(int i=;i<m;i++){
scanf("%d%d",&his[i].attack,&his[i].defense);
}
printf("Case #%d: %d\n",cas++,solve());
}
}
return ;
}
end
2014_acmicpc_shanghai_google的更多相关文章
随机推荐
- Java ZK image 處理
自己上 ZK 官方論壇提問.別人的回答.自己解決問題後上傳的問題紀錄: http://forum.zkoss.org/question/101152/how-do-i-binding-image-fi ...
- (转)PHP的语言结构和函数的区别
相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等. 例子: if ( isset($user) ) { //do some thi ...
- C#连接mysql实例
using System; using System.Configuration; using MySql.Data.MySqlClient; /// <summary> /// Test ...
- Noise,Error,wighted pocket Algorithm
错误衡量(Error Measure) 有两种错误计算方法: 第一种叫0/1错误,只要[预测≠目标]则认为犯错,通常用于分类:通常选择,错误比较大的值作为y˜的值 第二种叫平方错误,它衡量[预测与目标 ...
- Collection中的排序
我们来了解一下Collection的框架与接口: Set接口下面已经有SortedSet接口,其中提供了很多自带排序的实现类,例如ThreeSet,用户还能够自定义比较器来规定自己的排序规则. 本篇着 ...
- open/fopen read/fread write/fwrite区别
fopen /open区别 UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write这里简单的介绍一下他们的区别.1 ...
- Python input()
在Python语言中,我们经常需要与用户实现交互,下面是一个小实例 # -*- coding:UTF-8 -*- #获取输入参数,并将输入的值存储到txt文件中 String1 = input(&qu ...
- 深入浅出const
§通常,如果一个对象通过引用方式传到函数f中,而函数f又不会通过修改对象的数据成员的值改变该对象的状态,那么,我们最好将f的参数标记为const,这样可以预防对参数的误写,同时有些编译器还可对这种情况 ...
- Golang的Semicolons
Semicolons The formal grammar uses semicolons ";" as terminators in a number of production ...
- Go语言类型switch
switch还可以用于判断变量类型.使用方式为T.(type),即在变量后加上.(type).见代码: package main import ( "fmt" ) func mai ...