必威体育Betway必威体育官网
当前位置:首页 > IT技术

Strength

时间:2019-10-14 16:44:36来源:IT技术作者:seo实验室小编阅读:80次「手机版」
 

strength

Strength

题意:你有n个怪物,敌方有m个怪物,你攻击对方攻击状态的怪物,对方会损伤两个怪物攻击值的差值的血量,当然你的怪物的攻击力肯定要大于对方的。攻击防御的则对方不受伤害,最后还剩多少怪物,他就直接承受他们的伤害,问怎样使得对方所受伤害最大。

贪心:两种情况,你能把所有的怪打死,选最少的花费去攻击防御怪,剩下的减去攻击怪即可,你不能把所有怪打死就每次选最大的打最小的攻击怪。

#include<bits/stdc++.h>
using namespace std;
struct node{
	int s,t;
}a[100005];
int b[100005];
int vis[100005];
int cmp(node x,node y){
	return x.s<y.s;
}
int main(){
	int T;
	scanf("%d",&T);
	for(int j=1;j<=T;j++){
		memset(vis,0,sizeof(vis));
		int n,m;
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++)
			scanf("%d",&b[i]);
		for(int i=0;i<m;i++)
			scanf("%d",&a[i].s);
		for(int i=0;i<m;i++)
			scanf("%d",&a[i].t);
		sort(a,a+m,cmp);
		sort(b,b+n);
		long long ans1=0,ans2=0;
		int l=0,r=0;
		while(l<n&&r<m){
			if(b[l]>=a[r].s){
				if(a[r].t==0){
					ans1+=b[l]-a[r].s;
				}
				vis[l]=1;
				l++;
				r++;
			}
			else l++;
		}
		if(r==m){
			for(int i=0;i<n;i++)
				if(!vis[i])
					ans1+=b[i];
		}
		else{
			l=0,r=n-1;
			while(r>=0&&l<m){
				if(b[r]>=a[l].s&&a[l].t==0){
					ans2+=b[r]-a[l].s;
					r--;
					l++;
				}
				else l++;
			}
		}
		printf("Case %d: %lld\n",j,max(ans1,ans2));
	}
}

相关阅读

分享到:

栏目导航

推荐阅读

热门阅读