zoukankan      html  css  js  c++  java
  • 【题解】 [ZJOI2008] 泡泡堂(贪心/二分图/动态规划)

    懒得复制,戳我戳我

    Solution:

    • 就是有一个贪心策略:(以下假设使(A)队分数更高)
    • (First:)比较两个分值的最小值,如果(A)最小分比(B)最小分大就直接比较两个最小的,(A)队分数加两分。
    • (Second:)上一条不满足我们就比较(A)(B)最大值,如果(A)更大,就直接比较(A)队加两分
    • (Thrid:)上一条不满足我们就比较(A)最小值和(B)最大值,如果相等就都加一分,否则就(B)加两分

    • 以上贪心不会证明,可以去百度百科看看
    • 二分图的话可以把(A)点中一点连向(B)中比他小的点,然后找最大匹配啥的乱搞一下应该也行

    Code:

    //It is coded by Ning_Mew on 4.7
    #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
    ",work(2));
      return 0;
    }
    
    
  • 相关阅读:
    每日一题
    每日一题
    mysql 约束
    七种基础排序算法代码总汇
    netty之bytebuf粘包、分包
    Java nio 简易练手版 模拟用户群聊
    Java网络编程之终端聊天菜鸟版
    双重检测优化与加锁操作redis
    centos部署smb服务
    从事 iOS 研发6年的面经——送给准备跳槽的你!
  • 原文地址:https://www.cnblogs.com/Ning-Mew/p/8737154.html
Copyright © 2011-2022 走看看