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
  • 相关阅读:
    关于java集合框架(二):List
    仪式感
    java的foreach(增强for循环)
    关于Java集合框架(一):概述与Set
    重新开始
    简单fork循环分析
    fork,写时复制(copy-on-write),vfork
    树莓派换源
    Windows下TexLive2018环境配置及检测
    Linux下高精度时间
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11535982.html
Copyright © 2011-2022 走看看