FZU - 2265 Card Game (Second Edition)

/*
  看来我思维方面还是...可能做题太少,还没建立题感,别人能想到想明白的,我却很难才能相通
  
  就题论题...这题的关键是,胖兄弟有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\n", c, (double)ans / (double) n);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值