LA 4329 Ping pong
2016-04-18 19:57
267 查看
读题之后 首先是没有思路 看了书上的思路之后, 还是不大懂, 终于》》》 看了大神的代码之后才懂一点点
下面是我改过的代码~~~~
题意:
一条大街上住着n个乒乓球爱好者,经常组织比赛。每个人都有一个技能值ai,每场比赛需要3个人:两名选手和一名裁判。规定裁判位置必须在两个选手的中间,而且技能值也必须在两个选手的中间,问一共能组织多少种比赛
思路:
考虑第i个人当裁判的情形,假设a1到a[i-1]中有ci个比ai小,那么就有(i-1)-ci个比ai大,同理,假设a[i+1]到an中有di个比ai小,那么就有(n-i)-di个比ai大,然后根据乘法原理和加法原理,i当裁判有ci(n-i-di)+(i-ci-1)*di,这样问题就转化为求c,d
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; ///#define N 1000000 ************ 之前N一直开10000结果程序一直崩, 我都要崩溃了, 发现错误是这之后 const int N = 10000000;************我都要哭了 #define lowbit(x) (x&-x) int a ,c ; int s1 ,s2 ; int sum(int x) { int ret = 0; while(x>0) { ret+=c[x]; x-=x&(-x); } return ret; } void add(int x,int d) { while(x<=100005) { c[x]+=d; x+=x&(-x); } } int main() { int T; int n; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=1; i<=n; i++) scanf("%d", &a[i]); memset(c, 0, sizeof(c));///清空数组 for(int i=1; i<=n; i++)///所有的数都加1 { add(a[i], 1);///a[i]一次次加1, s1[i] = sum(a[i]-1);///求和 , 和能计数,计算比a[i]小的个数, 感觉不是很好理解 } memset(c, 0, sizeof(c));///清空数组 for(int i=n; i>=1; i--) { add(a[i], 1); s2[i] = sum(a[i]-1); } long long ans = 0; for(int i=2; i<=n; i++) { ans += s1[i]*(n-i-s2[i])+s2[i]*(i-s1[i]-1);///乘法原理和加法原理 } printf("%lld\n", ans); } }
相关文章推荐
- 第三周项目4 --猜数字
- LeetCode OJ 141. Linked List Cycle
- 编译Valgrind arm交叉编译
- Jquery使用小结
- Java中HashMap详解
- 母函数最终模板(备忘录)
- HDU 1076 An Easy Task(数学题)
- 痛彻心扉
- Rust 1.7.0 语法基础 标识符(ident)和分隔符的约束
- jQuery和DOM对象
- 2------------NLPIR(ICTCLAS2016)分词系统添加用户词典功能
- javaDAY5
- 微信公众平台最实用的工具和技巧大集合
- 个人对设计模式的理解-->建造者模式
- Android NDK errors
- HashMapUtil java项目中缓存的使用
- 应用 Valgrind 发现 Linux 程序的内存问题及交叉编译for arm
- 用Java 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出
- leetCode——随机链表复制
- v8 Convert JSObject To String