懒得复制,戳我戳我
Solution:
- 就是有一个贪心策略:(以下假设使A队分数更高)
- First:比较两个分值的最小值,如果A最小分比B最小分大就直接比较两个最小的,A队分数加两分。
- Second:上一条不满足我们就比较A与B最大值,如果A更大,就直接比较A队加两分
- Thrid:上一条不满足我们就比较A最小值和B最大值,如果相等就都加一分,否则就B加两分
- 以上贪心不会证明,可以去百度百科看看
- 二分图的话可以把A点中一点连向B中比他小的点,然后找最大匹配啥的乱搞一下应该也行
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int n;
int sl[maxn],ds[maxn];
bool cmp(const int &x,const int &y){return x<y;}
int work(int num){
int pl=1,lt=n,pll=1,ltt=n,ans[3]={0,0,0};
while(pl<=lt){
if(sl[pl]>ds[pll]){
ans[1]+=2; pl++;pll++;continue;
}else{
if(sl[lt]>ds[ltt]){
ans[1]+=2; lt--;ltt--;continue;
}
else{
if(sl[pl]==ds[ltt]){
ans[1]++;ans[2]++; pl++;ltt--; continue;
}else{
ans[2]+=2;pl++;ltt--;continue;
}
}
}
}
return ans[num];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&sl[i]);
for(int i=1;i<=n;i++)scanf("%d",&ds[i]);
sort(sl+1,sl+n+1,cmp);
sort(ds+1,ds+n+1,cmp);
printf("%d ",work(1));
for(int i=1;i<=n;i++)swap(sl[i],ds[i]);
printf("%d\n",work(2));
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步