小金防呀防不住_AK

小金防呀防不住_AK
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description

众所周知,C语言的学习是我们程序设计基础的重点和主要内容。
首先恭喜大家终于来到最后一道题目,那么我要告诉你这次的期末考试题目难度是从题目1到题目8依次递增的。
那么作为最后一道水题,它的存在意义当然是让15级的巨巨们好好动动脑子啦。
小金自从进了集训队,做了很多有关于逆序对的题目,他也很喜欢逆序对。介绍一下逆序对。逆序对就是在一个数组序列中的两个数x和y,但这两个数x和y可以算作一个逆序对的规则是x要大于y,但x的位置一定要在y的前面(即i < j && a[i] > a[j] )。
那么小金的问题来了,如果给定一个长度为n的序列,这n个数保证大于等于0且小于n,并且不会重复。那么小金给了你一个移动操作,你可以将这个序列的第一个数拿到序列的最后将序列变为一个新的序列,例如当n=10的时候,给定一个序列。
那么,所有可能通过移动得到的序列如下。

请你输出在所有可能出现的序列中逆序对的个数最小的是多少?

Input

多组输入。
第一行输入整数n,含义如题意描述。(0 < n < = 5000)
第二行有n个整数(0 < = x < = n-1)。
Output

输出最小逆序对的个数。输入输出各占一行,保证数据合法。
Example Input

10
1 3 6 9 0 8 5 7 4 2
Example Output

16


#include<stdio.h>
int main()
{
int n,i,j,min,sum;
int s[10000];
while(~scanf("%d",&n))
{
sum=0;
for(i=0; i<n; i++)
{
scanf("%d",&s[i]);
}
for(i = 0; i < n; ++i)
{
for(j = i+1; j < n; ++j)
{
if(s[i] > s[j])
sum++;
}
}
min = sum;
for(i =0; i <n-1 ; i++)
{
sum = sum +n-1;
sum = sum -s[i]*2;
if(min > sum)
min = sum;
}
printf("%d\n",min);
}

}


规律,第一个数k移动最后,逆序对减少k个,增加n-k个,因为k在在首位时,比k小的的有k个数,移动到最后时,比k大的有n-k个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值