zoukankan      html  css  js  c++  java
  • noip2013 火柴排序

    涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:

    ::点击图片在新窗口中打开::

    ,其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度。
    每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。

    intput:

    4
    2 3 1 4
    3 2 1 4

    output:

    1

    思路:

    先开一个结构体,然后输入。按照v的大小升序排序。

    1 const int maxn=100010;
    2 struct cyc
    3 {
    4     int V,id;
    5 }a[maxn],b[maxn];

    然后,将a中元素对应b的的位置储存到c。

    最后,归并排序即可。

     1 #include<iostream>
     2 #include<string>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<iomanip>
     8 #include<queue>
     9 using namespace std;
    10 const int maxn=100010,lln=99999997;
    11 struct cyc
    12 {
    13     int v,id;
    14 }a[maxn],b[maxn];
    15 int n;
    16 int c[maxn],d[maxn];
    17 int ans=0;
    18 bool myc(cyc x,cyc y)
    19 {
    20     return x.v<y.v;
    21 }
    22 void work(int l,int r)
    23 {
    24     int mid,tmp,i,j;
    25     if(l+1<r)
    26     {
    27         mid=(l+r)/2;
    28         work(l,mid-1);
    29         work(mid,r);
    30         tmp=l;
    31         for(i=l,j=mid;i<=mid-1&&j<=r;)
    32         {
    33             if(c[i]>c[j])
    34             {
    35                 d[tmp++]=c[j++];
    36                 ans=1LL*(ans+mid-i)%lln;
    37             }
    38             else
    39             {
    40                 d[tmp++]=c[i++];
    41             }
    42         }
    43         if(j<=r)
    44         {
    45             for(;j<=r;j++)    d[tmp++]=c[j];
    46         }
    47         else
    48         {
    49             for(;i<=mid-1;i++)    d[tmp++]=c[i];
    50         }
    51         for(i=l;i<=r;i++)
    52             c[i]=d[i];
    53     }
    54     else{
    55         if(l+1==r)
    56         {
    57             if(c[l]>c[r])
    58             {
    59                 swap(c[l],c[r]);
    60                 ans=1LL*(ans+1)%lln;
    61             }
    62         }
    63     }
    64 }
    65 int main()
    66 {
    67     /*freopen("2.in","r",stdin);
    68     freopen("2.out","w",stdout);*/
    69     //ios::sync_with_stdio(false);
    70     cin>>n;
    71     for(int i=1;i<=n;i++)
    72     {
    73         cin>>a[i].v;
    74         a[i].id=i;
    75     }
    76     for(int i=1;i<=n;i++)
    77     {
    78         cin>>b[i].v;
    79         b[i].id=i;
    80     }
    81     sort(a+1,a+1+n,myc);
    82     sort(b+1,b+1+n,myc);
    83     for(int i=1;i<=n;i++)
    84         c[b[i].id]=a[i].id;
    85     work(1,n);
    86     cout<<ans<<endl;
    87     return 0;
    88 }
    View Code
  • 相关阅读:
    iPhone 调用Web Service 例子(转)
    iPhone开发:在UIAlertView中显示进度条(转)
    Oracel 分页
    NYOJ 477
    NYOJ 108(数组中存的是前n个数的和)
    NYOJ 199
    NYOJ 311(完全背包)
    高效斐数(前92位)
    NYOJ 57(6174问题)
    NYOJ 546(分珠宝)
  • 原文地址:https://www.cnblogs.com/zyker/p/5910180.html
Copyright © 2011-2022 走看看