博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1309-瑞士轮-归并
阅读量:4987 次
发布时间:2019-06-12

本文共 1429 字,大约阅读时间需要 4 分钟。

确实是一道很好的题

(反正对我来说是的了)

在大概了解了(模糊的)思路之后

我就上手写了

纯模拟吧

每一轮就归排一次

当然时间复杂度是过不去的

(但是我是先wa的)

于是我才反思

得到了另半种种算法思路

如下:

根据题意

先把那一堆东西全输入进来

在根据初始的s值排序(这里是可以用sort的)

(这之前都很常规)

于是再循环每一轮

两两相比

把赢得放在一个数组,把输的放在一个数组

每个数组(赢输两数组)中都是降序的

在把这两个数组的每个头元素轮番比较放回原数组(和归并很类似,但比归并省了好多好多遍)

就odk了

省了好多呢

#include
#include
using namespace std; int n,r,q; int a[200100],win[200100],los[200100]; int s[200100],w[200100]; bool cmp(int x,int y) { if(s[x]==s[y]) return x
s[y];} void sol() { int i,j; i=j=1,a[0]=0; while(i<=win[0] && j<=los[0]) if(cmp(win[i],los[j])) a[++a[0]]=win[i++]; else a[++a[0]]=los[j++]; while(i<=win[0]) a[++a[0]]=win[i++]; while(j<=los[0]) a[++a[0]]=los[j++]; } int main() { cin>>n>>r>>q;n*=2; for(int i=1;i<=n;i++) a[i]=i; for(int i=1;i<=n;i++) cin>>s[i]; for(int i=1;i<=n;i++) cin>>w[i]; sort(a+1,a+n+1,cmp); for(int i=1;i<=r;i++) { win[0]=los[0]=0; for(int j=1;j<=n;j+=2) if(w[a[j]]>w[a[j+1]]) { s[a[j]]++; win[++win[0]]=a[j]; los[++los[0]]=a[j+1]; } else { s[a[j+1]]++; win[++win[0]]=a[j+1]; los[++los[0]]=a[j]; } sol(); } cout<

 

转载于:https://www.cnblogs.com/darlingroot/p/10472894.html

你可能感兴趣的文章
Python开发 基礎知識 (未完代補)
查看>>
监听器的使用,以及实现, 测试
查看>>
java基础二 分支循环
查看>>
python--002--数据类型(list、tuple)
查看>>
把近期的小错误整理一下
查看>>
动态规划 —— 背包问题一 专项研究学习
查看>>
51nod 1571 最近等对 | 线段树 离线
查看>>
关于parseInt的看法
查看>>
从用户端到后台系统,严选分销教会我这些事
查看>>
数据分析融入至BI工具的新思路
查看>>
c#必会知识点
查看>>
网页使用MD5加密
查看>>
JS 基础
查看>>
HBase shell 中的十六进制数值表示
查看>>
Python3 中 configparser 模块解析配置的用法详解
查看>>
新手android环境搭建、debug调试及各种插件安装__图文全解
查看>>
未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 win2008R2 X64 IIS7.5
查看>>
Diffuse贴图+Lightmap+Ambient
查看>>
矩阵树定理
查看>>
[算法]Evaluate Reverse Polish Notation
查看>>