题目地址:http://poj.org/problem?id=1804
本题就是求一个序列的逆序数,在不看昨天代码的前提下,有一个地方写错了
就是Combine函数那边少了第一个while循环,切记!
本题的输入又是一个新的写法,所以需要学习一下,虽然是多组样例输入,可是组数已经确定
所以就不用xxxx!=EOF来做
设置了caseNumber和caseOrder两个变量
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = 1e6 + 10;
int arr[MAXN];
int temp[MAXN];
int number;
void Combine(int left, int middle, int right){
int i = left;
int j = middle + 1;
int k = left;
while(i <= middle && j <= right){//这个while不能少!!!!!
if(arr[i] <= arr[j]){//这儿是小于等于!!!!别漏了!!!
temp[k++] = arr[i++];
}else{
temp[k++] = arr[j++];
number += middle + 1 - i;
}
}
while(i <= middle){
temp[k++] = arr[i++];
}
while(j <= right){
temp[k++] = arr[j++];
}
for(k = left; k <= right; ++k){
arr[k] = temp[k];
}
}
void MergeSort(int left,int right){
if(left < right){
int middle = left + (right - left)/2;
MergeSort(left, middle);
MergeSort(middle + 1, right);
Combine(left,middle,right);
}
}
int main(){
int caseNumber;
int caseOrder;
scanf("%d",&caseNumber);
for(caseOrder = 1; caseOrder <= caseNumber; ++caseOrder){//注意!!组数从1开始!!!
int n;
number = 0;
scanf("%d",&n);
for(int i = 0; i < n; ++i){
scanf("%d",&arr[i]);
}
MergeSort(0, n - 1);
printf("Scenario #%d:\n",caseOrder);
printf("%d\n\n",number);
}
return 0;
}