当前位置: 首页 > news >正文

CF234G Practice - crazy-

这道题其实挺难想的,我最开始想的是 \(n-1\) 的构造方式,再加上好损友的亿点提示(关键部分没听他的),接着是 \(\dfrac{n}{2}\) 的构造,最后才是正解 \(\lceil \log _2 n \rceil\)

题目传送门

题意

现在有 \(n\) 个人进行比赛(编号从 \(1\)\(n\)),每次把这 \(n\) 个人不遗漏地分成两队进行比赛。

请构造一种比赛方式,使得比赛次数尽可能少,并且每两个人之间都在不同队比赛过。

思路

首先,最简单的思路就是,\(n-1\) 轮,每个人和其他没有和他比过赛的人比赛。

很明显,这不是最优的。

接着,考虑优化。(中间 \(\dfrac{n}{2}\) 的想法忘了咋搞了就不说了)

可以先让 \(n\) 个人分成两队比赛,然后对内再进行比赛,以此类推。

我们可以把比赛过程想象成一棵树。这里用 \(n=10\) 举例。

img

第一种情况可以这么分,那么第一场比赛就是 \([1,5]\)\([6,10]\) 打。

接着,\([1,5]\)\([6,10]\) 要在内部进行比赛。

img

那么,很关键的一步,\([1,2]\)\([3,5]\) 要在内部打,\([6,7]\)\([8,10]\) 要在内部打。那,我们可以将 \([1,2]\)\([6,7]\) 分到一队,\([3,5]\)\([8,10]\) 分到另一队,这时候,虽然有些人会重复打,但是我们把两场比赛合并为了一场,简化了操作数量。

也就是说,他们实际上各打各的,互不干扰,只不过名义上是一支队伍罢了。

接着继续分,我就不过于详细的解释了。

img

也就是说,我们可以构造一个长度为\(n\)的线段树,每次输出其叶子节点中的左节点即可。

在程序实现上,不需要真的构建出一个线段树,只需要维护其全部叶子节点即可。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
void FASTIN();
struct range
{int l,r;int root;//0 左节点 1 右节点
}f[1010],t[1010];
void play(int n)
{int ans=0,cnt=0;for(int i=1;i<=n;i++){if(f[i].l==f[i].r) continue;int mid=(f[i].l+f[i].r)>>1;//分成左右两个部分,也就是内部继续对打cnt++;t[cnt].l=f[i].l,t[cnt].r=mid,t[cnt].root=0;cnt++;t[cnt].l=mid+1,t[cnt].r=f[i].r,t[cnt].root=1;ans+=mid-f[i].l+1;}for(int i=1;i<=cnt;i++) f[i]=t[i];cout<<endl;cout<<ans<<" ";bool flag=0;for(int i=1;i<=cnt;i++){if(!f[i].root){for(int j=f[i].l;j<=f[i].r;j++) cout<<j<<" ";}if(f[i].l!=f[i].r) flag=1;}cout<<endl;if(flag) play(cnt);
}
void run()
{int n,ans=0;cin>>n;while((1<<ans)<n) ans++;cout<<ans<<endl;f[1].l=1,f[1].r=n;play(1);
}
int main()
{freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);FASTIN();int t=1;// cin>>t;while(t--) run();system("pause");return 0;
}
void FASTIN()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
}
http://www.jsqmd.com/news/88835/

相关文章:

  • 实习面试题-MapReduce 面试题
  • 11、UNIX安装基础全解析
  • 基于Simulink的双向DCDC变换器系统仿真
  • 2025年数字化转型:AI技能+CAIE认证夯实进阶根基
  • 软件工程期末考试-数据流图、状态图、用例图、类图等怎么画?
  • CF1475C Ball in Berland - crazy-
  • 大数据领域体系认知
  • 储能系统双向 DCDC 变换器双闭环控制:解锁蓄电池充放电仿真的奥秘
  • CF1506C Epic Transformation - crazy-
  • 服务端渲染(SSR)中的 JS 激活(Hydration):前后端状态同步的底层挑战
  • 2025年男孩取名机构推荐:权威榜单TOP5机构深度解析 - 十大品牌推荐
  • 1、深入了解 UNIX 操作系统:特性、历史与哲学
  • CF1536C Diluc and Kaeya - crazy-
  • JavaScript 源代码的 AST 转换:Babel 插件是如何改变你编写的代码的?
  • 2、UNIX基础入门教程
  • 2025年男孩取名机构推荐:2025年专业取名机构权威榜单TOP5深度解析 - 十大品牌推荐
  • 2025年互联网行业:AI技能+CAIE认证打造核心竞争力
  • CF1538F Interesting Function - crazy-
  • 2025年男孩取名机构推荐:权威取名机构榜TOP5深度解析 - 十大品牌推荐
  • 快速排序的理解与实践(c语言实现)
  • 3、学习 UNIX 的额外资源
  • Open-AutoGLM 实战:手把手教你用 AI 做App自动化测试「喂饭教程」
  • 6、互联网通信全解析:从邮件到多媒体的多元世界
  • 含分布式电源配电网潮流计算及相关实践
  • CF1542B Plus and Multiply - crazy-
  • React 新手村通关指南:状态、组件与魔法 UI
  • 7、UNIX 外壳:从基础到高级编程的全面指南
  • CF1545A AquaMoon and Strange Sort - crazy-
  • 8、深入了解Bash:功能、安装与使用指南
  • 动态规划01背包问题