一个萝卜一个坑
时间限制:1秒 内存限制:128M
题目描述
小可给一些萝卜施展了魔法,使得这些萝卜能够自主行动,甚至能开口说话!
小可对于自己的杰作十分满意,并挖好了一些坑,命令萝卜们自己选择一个坑来当成新家。
当然,一个萝卜一个坑,不能有多个萝卜共用一个坑。这些坑排成一排,从11到n编号。萝卜也刚好有n个。坑的深度从11到n逐渐加深。不能让比较矮的萝卜住比较深的坑,也不能让比较高的萝卜住比较浅的坑的,所有萝卜选好坑之后,任意两个位置)i,j(i<j)(这里是坑的位置),位置的萝卜的高度不能高于j位置的萝卜的高度。
萝卜们也从11到n编号,从编号11的萝卜开始按顺序一个一个地从编号为11的坑开始走,去选坑入住。每个萝卜每经过一个被其他萝卜占领的坑都会产生11点不满值,请问不满值最少是多少。
输入描述
第一行一个正整数(1≤≤100)t(1≤t≤100),代表有t组输入。
对于每组输入,第一行一个正整数(1≤≤300)n(1≤n≤300),代表有n个萝卜和n个坑。
第二行n个正整数1,2,..,(1≤≤109)a1,a2,..,an(1≤ai≤109)代表萝卜们的高度。
输出描述
对于每组输入,输出不满值最小是多少。
样例输入
431 2 352 1 5 3 322 162 3 2 1 1 1
样例输出
3601
提示
对于第二组输入
52 1 5 3 3
大概过程如下:
_ 2 _ _ _,不满值为0
1 2 _ _ _,不满值为0
1 2 _ _ 5,不满值为2
1 2 _ 3 5,不满值为4
1 2 3 3 5,不满值为6
通过题目描述,可以得知小可的不满值就是大萝卜去自己的坑时,前面小萝卜的数量。
所以,我们不难想到如下思路:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,cnt=0;
cin>>n;
int a[n+5];
for(int x=1;x<=n;++x) scanf("%d",a+x);
for(int i=1;i<=n;i++){ for(int k=i+1;k<=n;k++){ if(a[i]<a[k]) cnt++; } }
cout<<cnt<<"\n";
}
}
文章介绍了一个涉及萝卜高度和坑位分配的优化问题,要求最小化不满值。关键在于根据萝卜高度进行排序和计算萝卜间的比较次数。

172

被折叠的 条评论
为什么被折叠?



