博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LA 3177 长城守卫
阅读量:5160 次
发布时间:2019-06-13

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

n为偶数的时候比较简单,就是相邻两个守卫的礼物和的最大值。

首先这是个下限,其次这个值也满足题目要求,所以这就是答案了。

当n为奇数的时候上限是守卫索要礼物的最大值的三倍。

这也很容易理解,比如n=5,ri都为1的时候,每个人拿到的礼物是1,2,1,2,3

有了上限有了下限就可以二分找出答案来了。

test函数的作用就是测试p种礼物能否满足要求。

 

1 //#define LOCAL 2 #include 
3 #include
4 #include
5 using namespace std; 6 7 const int maxn = 100000 + 10; 8 int n, r[maxn], left[maxn], right[maxn]; 9 10 bool test(int p)11 {12 int x = r[1], y = p - x;13 left[1] = x; right[1] = 0;14 for(int i = 2; i <= n; ++i)15 {16 if(i & 1 == 1)17 {
//奇数尽量往后取18 right[i] = min(r[i], y - right[i-1]);19 left[i] = r[i] - right[i];20 }21 else22 {
//偶数则尽量往前取23 left[i] = min(r[i], x - left[i-1]);24 right[i] = r[i] - left[i];25 }26 }27 return (left[n] == 0);28 }29 30 int main(void)31 {32 #ifdef LOCAL33 freopen("3177in.txt", "r", stdin);34 #endif35 36 while(scanf("%d", &n) && n)37 {38 int i;39 for(i = 1; i <= n; ++i)40 scanf("%d", &r[i]);41 if(n == 1)42 {43 printf("%d\n", r[1]);44 continue;45 }46 int L = 0, R = 0;47 r[n+1] = r[1];48 for(i = 1; i <= n; ++i)49 L = max(L, r[i]+r[i+1]);50 if(n%2 == 1)51 {52 for(i = 1; i <= n; ++i)53 R = max(R, r[i]);54 R *= 3;55 while(L < R)56 {57 int mid = (L + R) / 2;58 if(test(mid))59 R = mid;60 else61 L = mid + 1;62 }63 }64 printf("%d\n", L);65 }66 return 0;67 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3886428.html

你可能感兴趣的文章
Linux 下常见目录及其功能
查看>>
python Termux Android 开发介绍
查看>>
开源框架中常用的php函数
查看>>
Java语法糖初探(三)--变长参数
查看>>
Liunx常用命令(Mile)
查看>>
nginx 的提升多个小文件访问的性能模块
查看>>
C#语言学习:变量的声明与初始化的范围(对比C++)
查看>>
D. Buy a Ticket(优先队列+dijkstra)
查看>>
set&map
查看>>
git解决一个电脑多用户情况(win7)
查看>>
《高级软件测试》实践作业4学习记录12月28日
查看>>
集合类总结
查看>>
spring boot开发REST接口
查看>>
[读书笔记] Python数据分析 (二) 引言
查看>>
4.AE中的缩放,书签
查看>>
CVE-2014-6321 && MS14-066 Microsoft Schannel Remote Code Execution Vulnerability Analysis
查看>>
网络攻防 第七周学习总结
查看>>
关于_weblogic.xml的sessionID配置
查看>>
给一次重新选择的机会_您还会选择程序员吗?
查看>>
Storm Trident示例CombinerAggregator
查看>>