UVALive
来源:互联网 发布:软件需求变更流程图 编辑:程序博客网 时间:2024/05/21 10:35
题目传送门
题意:给你n个军队,让你去攻打m个敌军,每支队伍(敌我双方)都有两个属性值,攻击力和防御力,问能否把敌军全部击灭,如果能的话我军最多能剩下多少支军队(如果我军攻击力>=敌军防御力&&我军的防御力>敌军的攻击力那么这支军队可以击杀敌军并且安全返回)
思路:又是策略问题,选择正确的策略是解决这个问题的关键。
我的策略是:首先对敌我双方进行排序,我方按攻击力排序,敌方按防御力排序,然后枚举敌方军队找到性价比最高的我方军队去攻击(能击杀敌这支军的我方军队里边性能最低的)这里分为三种情况
1、我方没有能击杀这支敌军的,直接break输出-1
2.我方有能击杀敌军的,但没有能安全返回的,这时我们派出的是所有能击杀敌军的我方军队里边的防御力最小的
3.我方有能击杀敌军并且安全返回,这时我们派出所有能击杀敌军并安全返回的我放军队里边的防御力最小的
ac代码:
#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;const int wp=1e9+1;struct troop{ int a,d;};troop a[100005],b[100005];bool cmp(troop a,troop b){ if(a.a==b.a) return a.d<b.d; else return a.a>b.a;}bool cmp2(troop a,troop b){ if(a.d==b.d) return a.a>b.a; return a.d>b.d;}int main(){ int t,cas=1; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%d%d",&a[i].a,&a[i].d); for(int i=0; i<m; i++) scanf("%d%d",&b[i].a,&b[i].d); int flag[100005]; if(n>=m) { sort(a,a+n,cmp); sort(b,b+m,cmp2); memset(flag,0,sizeof(flag)); int p=0; int sum=0; for(int i=0; i<m; i++) { int k=0; int q=0; int min1=wp; int min2=wp; int ph=-1; int ph1=-1; for(int j=0; j<n; j++) { if(a[j].a>=b[i].d&&a[j].d>b[i].a&&flag[j]==0) { q=1; if(a[j].d<min1) { min1=a[j].d; ph=j; } } if(a[j].a>=b[i].d&&flag[j]==0) { if(a[j].d<min2) { min2=a[j].d; ph1=j; } } if(a[j].a<b[i].d) { break; } } if(min1==wp&&min2==wp) { p=1; break; } if(q==1) { flag[ph]=1; } if(q==0) { flag[ph1]=1; sum++; } } printf("Case #%d: ",cas++); if(p==1) printf("-1\n"); else printf("%d\n",n-sum); } else printf("Case #%d: -1\n",cas++); } return 0;}
阅读全文
0 0
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- UVALive
- 物联网专题
- Apache+Django
- 2017.08.04回顾
- 在Dev C++中使用c语言图形库的配置
- 初探java集合框架
- UVALive
- 一篇比较好的介绍(两种线程模式)
- 禁止Cell被选中之后进入高亮状态
- 3D模型初探(人体运动学)
- 使用cJSON创建JSON字符串
- 近期交互学习记录
- Hibernate(五)一对多映射(多对一)
- 问一下大家个3D问题:旋转和缩放以及平移中如何插值矩阵?
- 最近公共祖先 LCA 倍增+Tarjan实现