标签:memset ring bre mem -- iostream using ret stream
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<map> #include<set> #include<queue> const int maxn=1e5+100; typedef long long ll; using namespace std; int a[maxn],b[maxn],cnt,visit[maxn];//cnt来记录防御态的个数 struct Node { int value,pos; bool operator <(const Node &d)const { return value<d.value; } } node[maxn]; int main() { int t,n,m; scanf("%d",&t); int kase=0; ll sum=0,sum1=0;; while(t--) { scanf("%d%d",&n,&m); memset(visit,0,sizeof(visit)); sum=0; sum1=0; cnt=0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); sum+=a[i]; } for(int i=0; i<m; i++) scanf("%d",&node[i].value); for(int i=0; i<m; i++) { scanf("%d",&node[i].pos); if(!node[i].pos) sum1+=node[i].value; if(node[i].pos) b[cnt++]=node[i].value; } ll ans,ans1; ans=ans1=0; //是否可以全部干掉 sort(node,node+m); sort(a,a+n); int flag=0; if(n>=m) { int i,j; i=n-1; j=m-1; for(; i>=0&&j>=0; i--) { if(node[j].value<=a[i]) j--; else break; if(!j) break; } if(!j) flag=1; } if(flag) { int j=0; for(int i=0; i<n&&j<cnt; i++) { if(a[i]>=b[j]) { j++; sum-=a[i]; } } if(j!=cnt) flag=0; else ans=sum-sum1; } int i=n-1,j=0; for(; i&&j<m; i--) { if(a[i]>=node[j].value) { if(!node[j].pos) { ans1+=(a[i]-node[j].value); } j++; } else break; } printf("Case %d: %lld\n",++kase,max(ans,ans1)); } return 0; }
这道题很有意思
首先题意不明(哈哈)
他有防御态,干掉对方所有怪之后才能直接打对方
两种情况
1、不全部干掉对方(用自己这边大的干对方最小的,用次大的干对方次小的,直到不能进行)
2、全部干掉对方(先用最小的代价干掉防御态,然后剩下的全部减去剩下怪的和就行)
标签:memset ring bre mem -- iostream using ret stream
原文地址:https://www.cnblogs.com/zhangzhenjun/p/12229839.html