BZOJ1863 [Zjoi2006]trouble 皇帝的烦恼

貌似以前做到过这题。。。结果没搞出来T T

现在终于会了!谁想出来的,这么巧妙>.<

首先二分总的勋章数,然后判断可行性。

判断方法(dp):

令a[i]表示i与1最少有多少相同勋章,b[i]表示i与1最多有多少相同勋章。

转移方程请自行脑补 or 见程序

最后判断a[n] == 0即可

 1 /**************************************************************
 2     Problem: 1863
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:44 ms
 7     Memory:1976 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <algorithm>
12
13 using namespace std;
14 const int N = 100005;
15 int n, ans;
16 int v[N], a[N], b[N];
17
18 inline int read(){
19     int x = 0;
20     char ch = getchar();
21     while (ch < ‘0‘ || ch > ‘9‘)
22         ch = getchar();
23     while (ch >= ‘0‘ && ch <= ‘9‘){
24         x = x * 10 + ch - ‘0‘;
25         ch = getchar();
26     }
27     return x;
28 }
29
30 bool check(const int x){
31     int i;
32     a[1] = b[1] = v[1];
33     for (i = 2; i <= n; ++i){
34         a[i] = max(0, v[1] + v[i] + v[i - 1] - b[i - 1] - x);
35         b[i] = min(v[i], v[1] - a[i - 1]);
36     }
37     return !a[n];
38 }
39
40 int main(){
41     int i, l, r, mid;
42     n = read();
43     for (i = 1; i <= n; ++i)
44         ans = max((v[i] = read()) + v[i - 1], ans);
45     l = ans - 1, r = ans * 2;
46     while (l + 1 < r){
47         mid = l + r >> 1;
48         if (check(mid)) r = mid;
49         else l = mid;
50     }
51     printf("%d\n", r);
52     return 0;
53 }

时间: 2024-07-29 14:12:45

BZOJ1863 [Zjoi2006]trouble 皇帝的烦恼的相关文章

【DP/二分】BZOJ 1863:[Zjoi2006]trouble 皇帝的烦恼

863: [Zjoi2006]trouble 皇帝的烦恼 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 465  Solved: 240[Submit][Status][Discuss] Description 经过多年的杀戮,秦皇终于统一了中国.为了抵御外来的侵略,他准备在国土边境安置n名将军.不幸的是这n名将军羽翼渐丰,开始展露他们的狼子野心了.他们拒绝述职.拒绝接受皇帝的圣旨.秦皇已经准备好了秘密处决这些无礼的边防大将.不过为防兵变,他决定先授

BZOJ 1863: [Zjoi2006]trouble 皇帝的烦恼( 二分答案 )

二分答案..然后从头到尾推一下, 看最后一个能不能取0个和第一个人相同的勋章 ----------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 20009; int w[maxn], Min[maxn], Ma

【BZOJ】【1863】【ZJOI2006】trouble 皇帝的烦恼

二分+DP Orz KuribohG 神题啊= = 满足单调性是比较显然的…… 然而蒟蒻并不会判断能否满足……QwQ 神一样的DP姿势:f[i]表示第 i 个与第1个最多有多少个相同,g[i]表示最少.那么如果g[n]==0就表示满足 1 /************************************************************** 2 Problem: 1863 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6

P4409 [ZJOI2006]皇帝的烦恼

题目描述 经过多年的杀戮,秦皇终于统一了中国.为了抵御外来的侵略,他准备在国土边境安置n名将军.不幸的是这n名将军羽翼渐丰,开始展露他们的狼子野心了.他们拒绝述职.拒绝接受皇帝的圣旨. 秦皇已经准备好了秘密处决这些无礼的边防大将. 不过为防兵变,他决定先授予这些将军一些勋章,为自己赢得战略时间.将军们听说他们即将被授予勋章都很开心,他们纷纷上书表示感谢.第i个将军要求得到ai枚不同颜色的勋章.但是这些将军都很傲气,如果两个相邻的将军拥有颜色相同的勋章他们就会认为皇帝不尊重他们,会立即造反(编号为

[ZJOI2006]皇帝的烦恼

题解: 具有单调性的题目还是要多想想二分答案 不二分答案暴力dp是n^3的 非常不优秀 二分答案之后就比较好做 mx[i],nx[i]表示最多/最少几个与a[1]相同 代码: #include <bits/stdc++.h> using namespace std; #define rint register int #define IL inline #define rep(i,h,t) for (rint i=h;i<=t;i++) #define dep(i,t,h) for (r

皇帝的烦恼

考虑到这是一个可怕的环,我们考虑二分. 容易想到集合的知识,两个相邻集合的交集是空集,求最小并集大小. 然后我们可以试着二分一下所有奖牌数\(n\). 可行性: 对于每一个集合 \(S_i\),满足一下情况即为可行 \[ 设 Min_i=\min S_i \cap S_1 (S_i \cap S_{i-1}=\empty) \ Min_i=n-Size(S_{i-1} \cup S_1) \ 即 Size(S_{i-1} \cup S_1) 尽量小 \ 也就是 Minn_{i-1} 尽量大(记作

hdu2057A+BAgain

单源最短路径算法-Dijkstra算法 bzoj1863[Zjoi2006]trouble皇帝的烦恼(二分+dp) c语言循环水题超时 Leetcode674LongestContinuousIncreasingSubsequence 僭屎押内欠崩记九右渴http://p.baidu.com/pai/center?uid=47f96162633161353264345033 拙桥膳悸环死在玖氏嚎https://weibo.com/u/6386483613 撬礁拍栽土畏妨萄咳即http://p.b

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

sunshine的神题(from2015.10.23)

codevs1513 皇帝的烦恼 题目大意:给定n个点成环,每个点要求染ai个颜色,要求相邻两点不能有相同颜色,求最少颜色. 思路:二分+dp.fi[i]表示i这个点和1最少相同颜色:gi[i]表示i这个点和1最多颜色,互相更新一下.如果fi[n]==0则可以(中间还要注意如果相邻两个点的和大于x也要返回false). orz sunshineorz sunshineorz sunshine #include<iostream> #include<cstdio> #include&