zoukankan      html  css  js  c++  java
  • C/c.pp:贪心,二分答案

    说是贪心有点牵强。

    其次,答案满足单调性,如果在k次操作能完成那么在k+1次操作内也能完成。

    因为大不了你就把多的一次对方操作再进行一次就好了。

    怎么操作呢?

    我们从头扫这个序列,遇到每一个不匹配位置就把那个数字所在位置和当前位置互换一下就好了。

    贪心?也许吧。没什么毛病。

    操作数是2n,不要把数组开小。

    cbx说是水题。。。刚开始不信,后来发现好像的确不太难。

    别想的太复杂!!!

    好好贪心。

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 int x[200005],n,a[400005],b[400005],p[200005],r[200005];
     5 bool check(int mid){
     6     for(int i=1;i<=n;++i)r[i]=x[i];
     7     for(int i=1;i<=mid;++i)swap(r[a[i]],r[b[i]]);
     8     for(int i=1;i<=n;++i)p[r[i]]=i;
     9     int cnt=0;
    10     for(int i=1;i<=n;++i)if(r[i]!=i)p[r[i]]=p[i],swap(r[i],r[p[i]]),cnt++;
    11     return cnt<=mid;
    12 }
    13 int main(){
    14     scanf("%d",&n);
    15     for(int i=1;i<=n;++i)scanf("%d",&x[i]),x[i]++;
    16     for(int i=1;i<=n<<1;++i)scanf("%d%d",&a[i],&b[i]),a[i]++,b[i]++;
    17     int l=0,r=n<<1;
    18     while(l<r-1)if(check(l+r>>1))r=l+r>>1;else l=(l+r>>1)+1;
    19     if(check(l))printf("%d
    ",l);else printf("%d
    ",r);
    20 }
    View Code
  • 相关阅读:
    在类中声明常量
    PHPStudy配置虚拟主机配置域名步骤
    PHPStudy配置虚拟主机步骤
    2019年7月22日星期一,简单的总结一下
    简单的面向对象
    session和cookie
    Jquery 事件绑定 bind 与on 的区别
    php try catch用法
    include,include_once,require,require_once的区别
    require与 include区别
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11535982.html
Copyright © 2011-2022 走看看