BZOJ1034 ZJOI2008 泡泡堂BNB 贪心

本文介绍了一种针对两组数列的优化算法,通过特定的排序和贪心策略,求解两数列如何排列可使特定条件下的得分最大化和最小化。算法首先对两数组进行排序,然后通过比较元素大小,采用不同的配对策略,最终得出最大和最小得分。

题意:给定两个数列a b,求两数列怎样排列能使a个数列中:2*(a[i]>b[i]的数量)+(a[i]=b[i]的数量)最大和最小。

题解:将两数组排序后,按如下流程贪心:(1)如果a最弱的人强于b最弱的人,两者相赛 (2)否则,如果a最强的人强于b最强的人呢,两者相赛 (3)否则,用a最弱的人与b最强的人相赛。而由于答案的最大值+最小值=2*N,所以别求一遍a b的最大答案即可。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 const int MAXN=100000+2;
 9 int N,a[MAXN],b[MAXN];
10 
11 int Slove(int *a,int *b){
12     int l1=1,l2=1,r1=N,r2=N,Ans=0;
13     while(l1<=r1 && l2<=r2)
14         if(a[l1]>b[l2]) l1++,l2++,Ans+=2;
15         else if(a[r1]>b[r2]) r1--,r2--,Ans+=2;
16         else if(a[l1]==b[r2]) l1++,r2--,Ans++;
17         else l1++,r2--;
18     return Ans;
19 }
20 
21 int main(){
22     cin >> N;
23     for(int i=1;i<=N;i++) scanf("%d",a+i);
24     for(int i=1;i<=N;i++) scanf("%d",b+i);
25     sort(a+1,a+N+1),sort(b+1,b+N+1);
26 
27     cout << Slove(a,b) << " " << 2*N-Slove(b,a) << endl;
28 
29     return 0;
30 }
View Code

 

转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6442958.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值