题目:http://acm.hdu.edu.cn/showproblem.php?pid=2443

这个题目尝试了很多种方法都过不去,上网查了一下网友们的的思路,竟然和逆序对数有关系!!

题目大意:

有n个士兵,他们都有各自的分数,有一项任务需要完成,为了能够确保合作更默契,他们的分数要差不多,所以有一个水平控制即平均数,所选的一组士兵的平均成绩必须大于该平均数。

问一共能选出多少组士兵能够完成该项任务?

思路:

求逆序对数。归并排序可以用来求逆序对数,这个没毛病。

代码如下:

 #include<iostream>
#include<cstring>
using namespace std;
void combine_sortd_list(int* to, int* sub1, int sz1, int* sub2, int sz2);
void merge_sort(int* lst, int sz);
const int MAX = 1e5 + ;
int arr[MAX];
long long int ans;
int main()
{
int Group, N, A;
cin >> Group;
while (Group--)
{
memset(arr, , sizeof arr);
cin >> N >> A;
for (int j, i = N-; i >=; --i)
{
cin >> j;
arr[i] = j - A + arr[i + ];
}
ans = ;
merge_sort(arr, N + ); //归并求逆序数
cout << ans << endl;
}
}
void merge_sort(int* lst, int sz)
{
static int tmp[MAX];
if (sz <= )return;
int* l = lst;
int lsz = (sz + ) / ;
int* r = l + lsz;
int rsz = sz / ;
merge_sort(l, lsz);
merge_sort(r, rsz);
combine_sortd_list(tmp, l, lsz, r, rsz);
for (int i = ; i < sz; ++i)lst[i] = tmp[i];
}
void combine_sortd_list(int*to, int* sub1, int sz1, int* sub2, int sz2)
{
int i = , j = , k = ;
while (i < sz1&&j < sz2)
if (sub1[i] <= sub2[j])to[k++] = sub1[i++];
else
{
ans += sz1 - i;
to[k++] = sub2[j++];
}
while (i < sz1)to[k++] = sub1[i++];
while (j < sz2)to[k++] = sub2[j++];
}

由公式推导解析题目意图:http://blog.csdn.net/scorpiocj/article/details/6227528

感谢您的阅读,生活愉快~

Counter Strike HDU 2443 逆序对数的更多相关文章

  1. POJ 1840 Brainman(逆序对数)

    题目链接:http://poj.org/problem?id=1804 题意:给定一个序列a[],每次只允许交换相邻两个数,最少要交换多少次才能把它变成非递降序列. 思路:题目就是要求逆序对数,我们知 ...

  2. POJ 2299 Ultra-QuickSort (求序列的逆序对数)

    题意:废话了一大堆就是要你去求一个序列冒泡排序所需的交换的次数. 思路:实际上是要你去求一个序列的逆序队数 看案例: 9 1 0 5 4 9后面比它小的的数有4个 1后面有1个 0后面没有 5后面1个 ...

  3. Ultra-QuickSort(树状数组求逆序对数)

    Ultra-QuickSort 题目链接:http://poj.org/problem?id=2299 Time Limit: 7000MS   Memory Limit: 65536K Total ...

  4. 怎样求逆序对数(Inverse Number)?

    #返回上一级 @Author: 张海拔 @Update: 2014-01-14 @Link: http://www.cnblogs.com/zhanghaiba/p/3520089.html /* * ...

  5. 给出一列数a1,a2,a3....an,求它们的逆序对数,即有多少个有序对(i,j) 使得iaj,n高达10的6次方

    //归并排序 //#include<stdio.h> //#include<string.h> //#include<algorithm> //#include&l ...

  6. BZOJ - 3744 Gty的妹子序列 (区间逆序对数,分块)

    题目链接 静态区间逆序对数查询,这道题用线段树貌似不好做,可以把区间分成$\sqrt n$块,预处理出两个数组:$sum[i][j]$和$inv[i][j]$,$sum[i][j]$表示前i个块中小于 ...

  7. Time Limit Exceeded 求逆序对数。

    /** 题目:Time Limit Exceeded 链接:https://oj.ejq.me/problem/28 题意:求逆序对数. 思路:树状数组求逆序对数.维护前面有多少个<=当前数的数 ...

  8. 用树状数组求逆序对数(poj2299)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 46995   Accepted: 17168 ...

  9. hdu 4911 Inversion(归并排序求逆序对数)2014多校训练第5场

    Inversion                                                                             Time Limit: 20 ...

随机推荐

  1. Sicily 1211. 商人的宣传

    题目链接:http://soj.me/1211 Description Bruce是K国的商人,他在A州成立了自己的公司,这次他的公司生产出了一批性能很好的产品,准备宣传活动开始后的第L天到达B州进行 ...

  2. imperva 更改web界面的密码

    通过SSH作为用户根登录到MX(或通过另一个用户并提升) 运行命令“su oracle” //首先切换到oracle用户 sqlplus secure/(密码)   /用此命令登录到数据库     s ...

  3. QEMU漏洞挖掘

    转载:https://www.tuicool.com/articles/MzqYbia qemu是一个开源的模拟处理器硬件设备的全虚拟化仿真器和虚拟器. KVM(kernel virtual mach ...

  4. setInterval做定时器

    <script src="/js/jquery-1.8.3.min.js"></script> <script> $(function () { ...

  5. parseObject方法将json字符串转换成Map

    String nwVal=recordDO.getWorkOrderNwVal(); HashMap<String,WxhcWorkOrderDO> nwMap=JSON.parseObj ...

  6. MySQL 删除数据

    删除数据的语句有三种:DELETE.DROP.TRUNCATE. 1.DELETE语句 DELETE 语句用于删除表中的行. 语法 DELETE FROM 表名称 WHERE 列名称 = 值 例如 - ...

  7. [shell]shell中if语句的使用

    转自:http://lovelace.blog.51cto.com/1028430/1211353 bash中如何实现条件判断?条件测试类型:    整数测试    字符测试    文件测试 一.条件 ...

  8. 11 The Go Memory Model go语言内置模型

    The Go Memory Model go语言内置模型 Version of May 31, 2014 Introduction 介绍 Advice 建议 Happens Before 在发生之前 ...

  9. 在虚拟机(vmware)上安装CentOS

    第一步是安装虚拟机,这个比较简单就不讲了. 第二步准备CentOS的镜像文件准备安装 第三步安装CentOS: 新建虚拟机 选择自定义配置 选择硬件兼容标准 选择是否让vmware安装操作系统 选择将 ...

  10. 使用插件实现Jenkins参数化构建

    一.插件安装 1.打开插件管理,在此界面可以安装插件 二.参数化 1.在“可选插件”中查找如下两个插件然后安装,安装后重启Jenkins Build With Parameters 输入框式的参数 P ...