【NOIP2011普及组】瑞士轮

这里写图片描述

题目意思:给你两个数组w和s,要求每次第一名(a[1])和第二(a[2])、第三和第四、第五和第六、第i(i+1<=n)和i+1名比赛,如果a[i].w>a[i+1].w则a[i].s++,然后重新按照a[i].s排序,重复以上操作直到操作次数等于R为止。求此时的A[Q].id
不难想到暴力算法,先把a排序,然后顺序扫描整个a如果a[i].w>a[i+1].w则a[i].s++,然后再快排一次。
时间复杂度为O(R*(2*n)*log2(2*n))对于本题n<=100000,R<=50的规模
运算次数为50*200000*18=1.8亿次,会超时。
正解,设一个数组Win存储这一轮赢了的人,Lose存储输的。
依然是顺序扫描a,把赢了的人放入Win中,输了的放入Lose中。
然后把Win和Lose按照cmp来合并,合并后的数组就是新的a,更新a,继续下一次归并排序直到次数等于R,输出答案;
这种做法由于是直接合并,扫描是O(2*n)的,所以最后的时间复杂度是O(R*2*n)就可以过了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值