zoukankan      html  css  js  c++  java
  • 蓝桥杯 小盆友排队

    问题描述
      n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。

      每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。

      如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。

      请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。

      如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。
    输入格式
      输入的第一行包含一个整数n,表示小朋友的个数。
      第二行包含 n 个整数 H1 H2 … Hn,分别表示每个小朋友的身高。
    输出格式
      输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。
    样例输入
    3
    3 2 1
    样例输出
    9
    样例说明
      首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友,再交换身高为2和1的小朋友,每个小朋友的不高兴程度都是3,总和为9。
    数据规模和约定
      对于10%的数据, 1<=n<=10;
      对于30%的数据, 1<=n<=1000;
      对于50%的数据, 1<=n<=10000;
      对于100%的数据,1<=n<=100000,0<=Hi<=1000000。
     
    #include <algorithm>
    #include<iostream>
    using namespace std;
    
    long long n=0;
    int  ang[100000]={0};   //swap次数 
    long long heigt[100000]={0};//身高数组 
    long long sum=0;
    int main()
    {
    	cin>>n; 
    	for(int i=0;i<n;i++)
    	{
    		cin>>heigt[i];
    	}
    	//初始化身高数组
    	
    	for(int i=0;i<n;i++) 
    	 for(int j=i;j<n;j++)
    	 {
    	  if(heigt[i]>heigt[j])
    	   	{
    	   		ang[i]++;
    	   		ang[j]++;
    	   	}
    	 }//寻找逆序对
    	 //标记好交换次数 
    	 
          for(int i=0;i<n;i++)   
          {
           	sum=sum+(ang[i]+1)*ang[i]/2;//累加      	
          }  
          
          cout<<sum;
        
    	return 0;
    }
    

      

     
     
  • 相关阅读:
    变量 常量 Python变量内存管理 赋值方式 注释
    leetcode 两数之和 整数反转 回文数 罗马数字转整数
    计算机基础之编程
    列表,集合,元组,字典
    小练习
    Ansi 与 Unicode 字符串类型的互相转换
    UVALive
    UVA
    UVA 10651 Pebble Solitaire 状态压缩dp
    UVA 825 Walkiing on the safe side
  • 原文地址:https://www.cnblogs.com/sundy-lee/p/4377402.html
Copyright © 2011-2022 走看看