补题next_permutation
第一题补题:
题目:田忌赛马,三局两胜
A 男男男女女女
B 男男男女女女
男双 混双女双 每次上场一次 谁大谁赢 平局a赢 问b赢的方案有多少种。
对于next_permutation
(1)首先,隐含条件: 必须是排序的才能做,不然它不知道何时退出。(一般是从正序排到倒序)
(2)其次,一般是do while,因为第一次也算。dowhile是先做do再while
do{
//代码内容
}while(next_permutation(b+1,b+4))
(3)就像sort一样,区间是左闭右开,所以3 3 排序是 b+1,b+4 / b+4 , b+7
深入探究:
1 2 3 4 5 6 ,那么1 2 3 有多少种呢?1 3 2 、2 3 1/2 1 3 、3 1 2 、 321
实际上是6种,因为是全排列……
这样6*6*6*6,反倒不是总计的81 聪明反被聪明误!直接for暴力就可以了!
(暗含: 上场男1男2.... 相同 vs 男2男1 是一种)
如果4个for循环,倒还是正好81次
依然写不对... 这节外生枝的有点过分啊
100 100 50 40 100 50 40 50 45 40 50 45 40
100 100 40 50 100 40 50 40 50 45 40 50 45
甚至找不出哪里不对,行吧我已经完全往答案靠拢了,还是这样,不想看了,听天命吧艹
结果发现是这里i j 写错了
if(sum1[0]-a[i]<sum2[0]-b[j]){
tmp++;
}
if(sum1[1]-a[ii]<sum2[1]-b[jj]){
tmp++;
}
看了下我之前写的伪暴力写法 ,也没啥问题,还真的就差一步之遥。
第二题:
排行榜问题,更新排行榜则拿到奖励
占位