/* 看来我思维方面还是...可能做题太少,还没建立题感,别人能想到想明白的,我却很难才能相通 就题论题...这题的关键是,胖兄弟有n张牌,也就有n种出牌的可能,把这n种情况下,可能得到的点数总和求出来,再除n得期望 点数总和怎么算? 把maze的所有牌排个序,比当前胖兄弟抽出的牌的点数要少的情况,就是胖兄弟出该牌得到的点数 以及,n种情况,都是独立考虑的,(虽然题目有提到过,一旦两人各自取出一张牌以后,这两张牌就不再出现)...按理说,我这么排序以后,用 lower_bound 来算,其实总觉得有点不对... 因为可能,胖兄弟第一轮出3,第二轮再出5,这么说,maze的牌中,比5小的那些牌,在胖兄弟出3时,可能有至少1张已经出过了,按照出过的牌排出考虑范围外,这张牌在第二轮就不应该被纳入考虑 所以,我最后的猜测是,可能对于胖兄弟的每一张牌,我们都是当作独立事件考虑,我们默认当前就是第一局,并将最后得到的结果除以n(也就是n张牌,可以理解为n轮),得到期望 总之这题理解也不到位,如果有时间,务必返工 最后,很有用的两个函数: lower_bound 和 upper_bound,学习一下: http://blog.csdn.net/jack_incredible/article/details/7377035 */
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int N = 1e4 + 10; int a[N], b[N]; int main() { int k, n; scanf("%d", &k); for (int c = 1; c <= k; c++) { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", a + i); for (int i = 0; i < n; i++) scanf("%d", b + i); sort(b, b + n); int ans = 0; for (int i = 0; i < n; i++) { int* t = lower_bound(b, b + n, a[i]); ans += (t - b); } printf("Case %d: %.2f ", c, (double)ans / (double) n); } return 0; }