二兵的赌注

Description
游戏中,二兵要进入了一家奇怪的赌场。
赌场中有n个庄家,每个庄家都可以猜大猜小,猜一次一元钱。
每一次开彩前,你都可以到任意个庄家那里下赌注。
如果开彩结果是大,你就可以得到你之前猜大的庄家相应的ai元钱。
如果开彩结果是小,你就可以得到你之前猜小的庄家相应的bi元钱。
你可以在同一个庄家那里既猜大又猜小,(这样是两块钱),也可以什么都不猜(这样不用钱)。
问怎么样下注,才能赢得最多的有保障的钱。
有保障的钱指不管开彩结果是大是小,你都能够赢得相应的钱。
你能帮助他计算这个值吗?
Input
第一行一个数字N。表示有N个庄家。
接下来N行,每行2个实数,分别表示这个庄家的ai和bi。
Output
一个四位小数,表示最多能赢的有保障的钱。
Sample Input
4
1.4 3.7
1.2 2
1.6 1.4
1.9 1.5
Sample Output
0.5000
HINT
样例中,最好的策略是赌第一个庄家开小,第三、第四个庄家开大
测试点 N
1 N≤10

2
3 N≤1000

4
5
6
7 N≤100000
8
9
10

1.0 ≤ ai, bi ≤ 1000.0

1s/128M

好了,拿到题先花一定的时间弄清题意。

然后我们就会发现:押大小和哪个庄家之间完全没有关系,一个庄家的大和小完全是独立的。继续分析,显然押越大的越好。

于是我们分别sort一下。

然后我开始了分析:首先读入时-=1,然后,设大或小为a[]和b[],分别取前i.j个押。

然后对于每对确定的i,j,易知s=min(suma[i]-j,sumb[j]-i)其中sum为前缀和。

我们设suma[i]-j=左,sumb[j]-i=右

然后定性分析:

当j固定时,i+则左+右-,i-则左-右+

当i固定时,j+则左-右+,j-则左+右-

再次分析可知对于一对(i,j),若i+,则可能存在的ans>s必须令j+

于是有了以下思路:for(i:1...n) 对于每个i找到匹配的j,则i++时j不用从头开始枚举,只需继续j++,于是时间复杂度O(n)完成(不记sort)

以上是我在考场上的思路。不管思考过程多么艰难以至于花费1hour才想出来,但是结果就是,和标准程序简直一模一样。但是代码实现上就很naive了。

同一个思路,我代码实现起来写了都要40+行,再一看标程,不到十行就解决了,尴尬......

我的代码大概是这样

 #include <cstdio>
using namespace std;
int a[],b;
void c();
int main()
{ ///读入
///sort一波
/**
for(i:1...n)
{
ax=xx
bx=xx
c=xx
while(j<=n && j<=c+a[i])
{
if(xXX)
xxx
else if(xxx)
xxx
else
xxx
}
d=xx
e=xx
f=xx
}
*/
return ;
}

my code

瞎设变量,大概近十个。

然后结果就是:推了一小时,打了半小时,最后又调了半小时。结果还是错的跟翔一样。

还有一个很奇怪的事:scanf读入double会出现蜜汁读入0,int就好得很。只好用cin缓慢读入了。找时间问一下雨菲,她肯定又不会理我。。。

那么来看看标程:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <math.h>
#include <queue>
#include <list>
#include <algorithm>
#include <map>
#include <set>
#include <stack>
#include <ctime>
using namespace std; #define ALL(c) (c).begin(),(c).end()
#define IN(x,c) (find(c.begin(),c.end(),x) != (c).end())
#define REP(i,n) for (int i=0;i<(int)(n);i++)
#define FOR(i,a,b) for (int i=(a);i<=(b);i++)
#define INIT(a,v) memset(a,v,sizeof(a))
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
template<class A, class B> A cvt(B x) { stringstream ss; ss<<x; A y; ss>>y; return y; } typedef pair<int,int> PII;
typedef long long int64; int n=;
double a[],b[]; int main() {
freopen("coin.in","r",stdin);
freopen("coin.out","w",stdout);
cin >> n;
REP (i,n) {
cin >> a[i] >> b[i];
a[i]-=; b[i]-=;
}
sort(a,a+n); reverse(a,a+n);
sort(b,b+n); reverse(b,b+n);
int i=,j=;
double r=;
double sa=,sb=;
while (i<n) {
sa+=a[i];
i++;
while (j<n && min(sa-j,sb-i)<min(sa-(j+),(sb+b[j])-i)) {
sb+=b[j];
j++;
}
r=max(r, min(sa-j,sb-i));
}
printf("%.4f\n",r);
return ;
}

标程

那么我们忽略上面一长串的头文件和宏定义。仔细观察关键部分可以发现:我那冗杂的程序和变量得到了极大的简化,强!喵!喵不可言啊!

接下来是文字答案中的二分,利用了单调性。

给出来:

Coin
算法零:
输出0即可。
算法一:
直接O(4^n)暴力枚举,期望得分20分。
算法二:
贪心,问题所求的是最大化min(∑ai ?na ?nb,∑bj ?na ?nb),na, nb分别表示猜大猜小的个数。将ai, bi全部减一,所求变为min(∑ai ?nb,∑bj ?na)。我们枚举na, nb,贪心取最大的na个ai和nb个ai即可。
复杂度O(n^2),期望得分60分
算法三:
贪心+二分,假设na固定,那么ai的选取也是确定的。假设nb从0开始一个个往上增加,∑bj –na递增,∑ai –nb递减。min(∑ai ?nb,∑bj ?na) 在∑bj –na超过∑ai –nb前递增。所以只需二分∑bj –na什么时候超过∑ai –nb即可。
复杂度O(n log n),期望得分100分。
标程:
直接sort+O(n)
思路跟我的一样可惜我TM写了30-40行的东西他十行不到搞定。
仍需努力呀。

我自己打了测了一下,最大的一个数据正确,但是跑了1.2s还是1.4s(算上了编译时间)

我的代码:

 #include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=;
int n;
double ans=-;
double a[N],b[N];
double suma[N],sumb[N];
bool cmp(double a,double b){return a>=b;}
int tw_divide(int l,int r,int i)
{
if(l==r) return r;
int mid=(l+r)>>;
double now=min(suma[i]-mid,sumb[mid]-i);
double nowl=min(suma[i]-mid+,sumb[mid-]-i);
double nowr=min(suma[i]-mid-,sumb[mid+]-i);
if(now>=nowl && now>=nowr) return mid;
if(now<nowl) return tw_divide(l,mid-,i);
if(now<nowr) return tw_divide(mid+,r,i);
}
int main()
{
freopen("coin.in","r",stdin);
//freopen("coin.out","w",stdout);
scanf ("%d",&n);
for(int i=;i<=n;i++)
{
cin>>a[i]>>b[i];
a[i]-=;b[i]-=;
}
sort(a+,a+n+,cmp);
sort(b+,b+n+,cmp); for(int i=;i<=n;i++)
{
suma[i]=suma[i-]+a[i];
sumb[i]=sumb[i-]+b[i];
}
double now;
int j;
for(int i=;i<=n;i++)
{
j=tw_divide(,n,i);
now=min(suma[i]-j,sumb[j]-i);
ans=max(ans,now);
}
printf("%.4f",ans);
return ;
}

my code

我还是比较喜欢第一种。二分时间多个logn而且还难得写。

2018.02.12 noip模拟赛T2的更多相关文章

  1. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  2. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  3. 2018.9.22 NOIP模拟赛

    *注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...

  4. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  5. EZ 2018 07 06 NOIP模拟赛

    又是慈溪那边给的题目,这次终于没有像上次那样尴尬了, T1拿到了较高的暴力分,T2没写炸,然后T3写了一个优雅的暴力就203pts,Rank3了. 听说其它学校的分数普遍100+,那我们学校还不是强到 ...

  6. EZ 2018 02 28 NOIP2018 模拟赛(二)

    我TM的终于改完了(其实都是SB题) 题目链接:http://211.140.156.254:2333/contest/53 T1送分,T2前40%送分,还有骗分机制在里面,T3暴力50 所以200应 ...

  7. EZ 2018 02 26 NOIP2018 模拟赛(一)

    这次是校内OJ(HHHOJ)线上比赛,网址:http://211.140.156.254:2333/contest/51 (我去刚刚快写完了手贱关掉了) 这次总体难度也不高,T1&&T ...

  8. 2018.10.12 NOIP模拟 字符处理(模拟)

    传送门 sb模拟,考试跟着sb了90分. 代码

  9. 2018/3/20 noip模拟赛 5分

    T1 傻逼题,写了cmp没sort,5分. T2 树上差分,写了树剖线段树,超时,0分. T3 树归,0分. 我是个zz

随机推荐

  1. jenkins配置SSH远程服务器连接

    之前用jenkins做了一个自动发布测试,配置任务的Post Steps时,选择的是执行shell命令.如下图: 这是在本192.168.26.233服务器上测试的,此服务器上运行jenkins,to ...

  2. 老男孩python学习自修第八天【函数式编程】

    1.可变参数,将传参自动汇总成列表 2.可变参数,将参数自动汇总成字典 实战如下: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ def show(*arg ...

  3. git放弃修改,强制覆盖本地代码

    $ git fetch --all $ git reset --hard origin/master $ git pull

  4. tornado web框架简介

    https://www.cnblogs.com/aylin/p/5702994.html

  5. JS判断语句 注意多句时加大括号 回调函数LODOP兼顾写法

    由于C-LODOP获取一些动作函数的返回值,需要用回调函数,由于常见的使用方法是混合部署,也就是同一个页面,根据浏览器的不同,可能会走LODOP ,也可能会走C-LODOP,因此写法要坚固两种,而有些 ...

  6. debug错误

    Description "opt_design" can fail with error messages similar to the following: opt_design ...

  7. luogu2258

    题面 sol:先爆搜搜出r行,再在那r行中选c列DP得到最优解 我太菜了,这种题都做了好久,还需锻炼码力啊qwq #include <cstdio> #include <cstrin ...

  8. Sublime Text ——3200破解补丁

    声明 该资源来源于网络,只为学习交流使用,侵权联系删除.长期使用和觉得sublime text 不错的话,还望购买授权码,多多支持正版!!! 重要的事情说三遍 请支持正版!!! 请支持正版!!! 请支 ...

  9. 洛谷P1582 倒水题解

    题目 分析 这个题并不难,只是需要仔细思考我们首先可以很轻松的把这个题给疏通一下题意. 1:首先我们最后每个瓶子中装的水一定是一个$2^x$,因为每次都是$2$倍的加,这个应该很好理解. 2:我们要明 ...

  10. POJ 3074 Sudoku(算竞进阶习题)

    二进制优化+dfs 话说这题数据中真的丧心病狂..不加inline还过不去.. 因为不会DLX只好用二进制来优化了...万万没想到还是低空飘过 我们在行.列.格分别用一个9位二进制常数来记录什么数能放 ...