zoukankan      html  css  js  c++  java
  • POJ1804Brainman

    转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1304317886

     

    大致题意:

    POJ2299一摸一样,区别在于数据规模缩小了而已

     

    解题思路:

    重申一次:

    一个乱序序列的 逆序数 = 在只允许相邻两个元素交换的条件下,得到有序序列的交换次数

     

    若想通过借助归并排序求逆序数

    可以参看我POJ2299的思路,几乎一模一样的程序,O(nlogn)算法

    http://user.qzone.qq.com/289065406/blog/1304259927

    不过由于规模的缩小,全部变量用int即可

     

    这题也可以直接求逆序数,无需借助归并排序

    S[i]s[i+1~n]的元素逐个比较,如果s[i] > s[k] (k[i+1,n]) 则逆序数t++  O(n^2)算法

     1 /*借助Mergesort求逆序数O(nlogn)*/
    2
    3 //Memory Time
    4 //228K 172MS
    5
    6 #include<iostream>
    7 using namespace std;
    8
    9 const int inf=1000001;
    10 int t; //数字序列s[]的逆序数
    11
    12 void compute_t(int* s,int top,int mid,int end)
    13 {
    14 int len1=mid-top+1;
    15 int len2=end-mid;
    16
    17 int* left=new int[len1+2];
    18 int* right=new int[len2+2];
    19
    20 int i,j;
    21 for(i=1;i<=len1;i++)
    22 left[i]=s[top+i-1];
    23 left[len1+1]=inf;
    24
    25 for(j=1;j<=len2;j++)
    26 right[j]=s[mid+j];
    27 right[len2+1]=inf;
    28
    29 i=j=1;
    30 for(int k=top;k<=end;k++)
    31 if(left[i]<=right[j])
    32 s[k]=left[i++];
    33 else
    34 {
    35 s[k]=right[j++];
    36 t+=len1-i+1;
    37 }
    38
    39 delete left;
    40 delete right;
    41
    42 return;
    43 }
    44
    45 void mergesort(int* s,int top,int end)
    46 {
    47 if(top<end)
    48 {
    49 int mid=(top+end)/2;
    50 mergesort(s,top,mid);
    51 mergesort(s,mid+1,end);
    52 compute_t(s,top,mid,end);
    53 }
    54 return;
    55 }
    56 int main(void)
    57 {
    58 int test;
    59 cin>>test;
    60 for(int p=1;p<=test;p++)
    61 {
    62 int n; //数字序列s[]长度
    63 cin>>n;
    64
    65 int* s=new int[n+1];
    66
    67 for(int i=1;i<=n;i++)
    68 cin>>s[i];
    69
    70 t=0;
    71 mergesort(s,1,n);
    72
    73 cout<<"Scenario #"<<p<<':'<<endl<<t<<endl<<endl;
    74
    75 delete s;
    76 }
    77 return 0;
    78 }

     

    =============华丽的分割线=============

     

     1 /*直接求逆序数O(n^2)*/
    2
    3 //Memory Time
    4 //220K 188MS
    5
    6 #include <iostream>
    7 using namespace std;
    8
    9 int main(int i,int j)
    10 {
    11 int test;
    12 cin>>test;
    13 for(int p=1;p<=test;p++)
    14 {
    15 int n;
    16 cin>>n;
    17
    18 int* s=new int[n+1];
    19 for(i=1;i<=n;i++)
    20 cin>>s[i];
    21
    22 int t=0; //s[]的逆序数
    23 for(i=1;i<=n-1;i++) //把S[i]和s[i+1~n]的元素逐个比较
    24 for(j=i+1;j<=n;j++)
    25 if(s[i]>s[j]) //如果s[i] > s[j] (j∈[i+1,n])
    26 t++; //则逆序数t++
    27
    28 cout<<"Scenario #"<<p<<':'<<endl<<t<<endl<<endl;
    29
    30 delete s;
    31 }
    32 return 0;
    33 }
  • 相关阅读:
    【转载】数据结构与算法设计
    【转载】简述Linux的启动过程
    【转载】20分钟MySQL基础入门
    【转载】linux内核笔记之进程地址空间
    【转载】linux内核笔记之高端内存映射
    Logical Address->Linear Address->Physical Address
    【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
    【转载】不会编程也能写爬虫?可视化爬虫工具是什么东东
    【转载】我是一个键盘
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2122204.html
Copyright © 2011-2022 走看看