题解 CF97C 【Winning Strategy】
题解 CF97C 【Winning Strategy】
此题是某平台%你赛原题,跟大家分享一下某校zsy和sxr等同学的神仙做法。
我解释一下题意,大是说,我有【无限】个人,每个人可以对他“伤害”至多两次。当伤害完第二次时,这个人会转变成一个贡献(Pi)。Pi和杀死的人数正相关。
Idea:
其实此题关键是“无限”这个关键词,这说明,操作到了极远的时候,其实是几种操作在互刷,稍后我们将伪证明,有且仅有特定两种操作在互刷。
为了方便讨论,我们定义:
- 没有被操作过的人称为“正常人”。
- 被“操作”一次的人称为“伤员”;
- 伤员被再次操作称为杀死或者牺牲;
- 某次(种)操作产生的伤员个数称作他的贡献。
开始解题
- 考虑每种操作的贡献,显然,每次操作除了可以杀死伤员之外,应尽量产生多的伤员。这样显然更优。
- 此外,由于是在极远的操作时求平均值,故我们可以假设某种互刷模式已经开始死循环,不需要铺垫条件,或者铺垫条件对答案的影响被忽略。
- 互刷的条件显然是,某些操作构成的集合造成的贡献(伤员个数),是另一个集合伤员的来源,这样显然最优。
- 对于由三种操作构成的互刷模式和由两种操作构成的模式,我们不妨令那三种互刷模式:P1<P2<P3,则它们需要的伤员数为n1<n2<n3
- 当P1和P2专注刷伤员,而P3专注杀死伤员时,P1和P2产生的对答案的影响是(P1+P2)/2,由于单调递增,则(P1+P2)/2 < P2 ,则这种操作不如干脆P2自己单独刷。因为当P1刷了n1*n2次时,不如P1自己刷。而在无限远的地方,就会产生这样的转变。
- 当P1专注刷伤员,而P2和P3专注杀死伤员时同理可证。
(其实是五)
可以知道,下标<n/2的,是产生伤员的,下标>(n/2)+1的,是消耗伤员的,若n为偶数,则下标n/2那个可以自己和自己刷。他们互刷的比例与他们的最小公倍数有关。
至此,我们引进第一种神仙做法,时间复杂度O(n2)
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double s[105],ans=0;
int w[105];
int gcd(int x,int y){
if(x%y==0)return y;
else return gcd(y,x%y);
}
int main(){
int n;
cin>>n;
for(int i=0;i<=n;i++)
{
cin>>s[i];
w[i]=n-i*2;//正贡献为正,负贡献为负
}
cout<<endl;
for(int i=0;i<=(n-1)/2;i++)
for(int l=(n/2)+1;l<=n;l++){
int t=gcd(abs(w[i]),abs(w[l]));
int m=abs(w[i])*abs(w[l])/t;
//最小共倍数
int x1=m/abs(w[i]);
int x2=m/abs(w[l]);
ans=max(ans,(s[i]*x1+s[l]*x2)/(x1+x2));
}
ans=max(ans,s[n/2]);//我刷自己
printf("%.10lf",ans);
return 0;
}
但是,我们可以大胆猜测!是不是把mid之前的(P/贡献)最大和mid之后的(P/贡献)最大加起来除以二就好了呢?
于是O(n)算法就出来了。读入时扫描,前面一半和后面一个分别找到最大的,然后就玄学了。
题解 CF97C 【Winning Strategy】的更多相关文章
- CF97C Winning Strategy
CF97C Winning Strategy 洛咕(题意应该快传上去了) 这题好玄学鸭...都不知道为啥是对的 设\(f[i][j]\)表示打了i轮比赛,有j个参加了一次的人,直接枚举有几个参加了转移 ...
- CF97C Winning Strategy 构造、图论
题目传送门:http://codeforces.com/problemset/problem/97/C 题意:给出$n$与一个范围在$[0,1]$内的递增序列$P_0-P_n$,试构造一个无穷序列$\ ...
- mark一下咕掉的题目
蒟蒻才普及组呀~ 大佬别D我 等集中补一下 CF980F:咋说捏,我觉得要联赛了做这题有点浪费时间,等想颓废了再来写写叭qwq 215E/279D/288E/331C3/431D/433E/750G/ ...
- 【POJ1568】【极大极小搜索+alpha-beta剪枝】Find the Winning Move
Description 4x4 tic-tac-toe is played on a board with four rows (numbered 0 to 3 from top to bottom) ...
- poj1568 Find the Winning Move[极大极小搜索+alpha-beta剪枝]
Find the Winning Move Time Limit: 3000MS Memory Limit: 32768K Total Submissions: 1286 Accepted: ...
- Codeforces 687B. Remainders Game[剩余]
B. Remainders Game time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces 549C. The Game Of Parity[博弈论]
C. The Game Of Parity time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Codeforces Round #360 (Div. 2) D. Remainders Game 中国剩余定理
题目链接: 题目 D. Remainders Game time limit per test 1 second memory limit per test 256 megabytes 问题描述 To ...
- Codeforces Bubble Cup 8 - Finals [Online Mirror]H. Bots 数学
H. Bots Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/H Desc ...
随机推荐
- web.xml文件的 xsd引用(或dtd引用)学习
1. 为什么web.xml会有不同版本的xsd引用: JDK依赖变化: 或 servlet(JAVA EE)自身API的改变: 2. 为什么会有dtd和xsd两个版本的区别 我是在这篇文章中看到的,作 ...
- 利用mvn/maven如何检查依赖冲突,并解决依赖冲突
mvn/maven如何检查依赖冲突,并解决依赖冲突 如图,点击图示位置,就可以把整个项目的依赖关系展示出来 在图里选中一个artifact,则所有依赖该artifact的地方都会一起连带出来突出显示, ...
- C#面试基础知识2
1.C#三层架构 C#三层架构急表示层(UI,User Interface),业务逻辑层(BLL BusinessLogicLayer),数据访问层(DAL Data Access Layer).三层 ...
- 【转】如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并 ...
- 新版本号的tlplayer for android ,TigerLeapMC for windows公布了
tlplayer for android 新版本号修正了图像倾斜等等问题,添加了动态水印功能. 支持hls(m3u8),http,rtsp,mms,rtmp等网络协议. 声明tlplayer 上的变速 ...
- Hadoop1.2.1 全然分布式集群搭建实操笔记
前期准备工作: 1.改动Linux主机名:/etc/hostname ubuntu系统:vi /etc/hostname ...
- Shell脚本值:运算符
算术运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用. expr 是一款表达式计算工具,使用它能完成表达式的求值操作. 例如:实现两个 ...
- 阿里巴巴天猫超市团队招聘java开发工程师
大家好,发个招聘信息:我是阿里巴巴集天猫超市开发团队的同学,我们部门目前在杭州招人,P6岗位,要求至少本科,熟悉java,spring等java开发技术,最好有互联网企业开发经验,感兴趣的可以通过我直 ...
- srm 541
资瓷点这里阅读该文章O_o 250 Solution 水题,最暴力的方法枚举就可以 Code #include <bits/stdc++.h> using namespace std; # ...
- JVM学习02-GC算法与种类
1. GC 简单介绍 GC(Garbage Collection) 是垃圾收集的简写,GC机制是java中一个比較重要的概念.java的内存管理提供了内存的分配和释放.内存处理是程序编写人员非常eas ...