UVA-1335(UVALive-3177) Beijing Guards 贪心 二分

news/2024/7/7 7:33:13 标签: 数据结构与算法

题面

题意:有n个人为成一个圈,其中第i个人想要r[i]种不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物。如果两个相邻的人拥有同一种礼物,则双方都会很不高兴,问最少需要多少种不同的礼物才能满足所有人的需求,假设每种礼物有无限多个。 n<=100000

题解:

对于n==1 直接输出a[1]

对于n是偶数,找相邻两个和的最大值

对于n是奇数,现在假设有m个奖品,1号放1---a[1],2号开始的偶数号都尽量放小的

奇数都尽量放大的,尽量的意思就是避开前一个的范围就好。

于是我们二分m这个值就好

 1 ​#include<bits/stdc++.h>
 2 #define N 100005
 3 using namespace std;
 4 int n,a[N],rr[N],ll[N],st,ed;
 5 int ans,l,r;
 6 int main()
 7 {
 8     while (scanf("%d",&n)!=EOF && n!=0)
 9     {
10         memset(a, 0, sizeof(a));  
11         int why=0;
12         for (int i=1;i<=n;i++13         { 
14             scanf("%d",&a[i]);
15             why=max(why,a[i]*3);
16         }
17         if (n==1)
18         {
19             printf("%d\n",a[1]);
20             continue;
21         }else
22         if (n%2==0)
23         {
24             ans=a[1]+a[n];
25             for (int i=2;i<=n;i++)
26                 ans=max(ans,a[i]+a[i-1]);
27             printf("%d\n",ans); 
28         }else
29         {
30             r=why+1;
31             l=a[1]+a[n];
32             for (int i=2;i<=n;i++)
33                 l=max(l,a[i]+a[i-1]);
34             while (l<r)
35             {
36                 int mid=(l+r)/2;
37                 st=a[1];
38                 ed=mid-a[1];
39                 ll[1]=st; 
40                 rr[1]=0;
41                 for (int i=2;i<=n;i++)
42                 {
43                     if (i%2==144                     {
45                         rr[i]=min(ed-rr[i-1],a[i]);
46                         ll[i]=a[i]-rr[i]; 
47                     }else
48                     {
49                         ll[i]=min(st-ll[i-1],a[i]);
50                         rr[i]=a[i]-ll[i];
51                     }
52                 }
53                 if (ll[n]==0) r=mid;else l=mid+1;
54             }
55             printf("%d\n",l);
56         }
57     }
58     return 0;
59 

转载于:https://www.cnblogs.com/qywhy/p/9672977.html


http://www.niftyadmin.cn/n/1270271.html

相关文章

mysql同步并联两张表_Mysql同一主机两张表结构相同的表数据同步-----触发器

1、执行过程&#xff1a;1)、################################插入DELIMITER//CREATE TRIGGER insert_BI_AppointmentOrder_trigger AFTER insert ON BI_AppointmentOrder FOR EACH ROW BEGIN--检查当前 环境&#xff0c;避免递归.IF disable_insert_trigger_o IS NULL THEN--…

Inter-process Communication (IPC)

For Developers‎ > ‎Design Documents‎ > ‎Inter-process Communication (IPC) 目录 1 Overview1.1 IPC in the browser1.2 IPC in the renderer2 Messages2.1 Types of messages2.2 Declaring messages2.2.1 Pickling values2.3 Sending messages2.4 Handling messa…

mysql创建乘积语法的触发器_创建Mysql触发器的语法介绍

Mysql触发器是Mysql数据库非常重要的部分&#xff0c;下文对创建Mysql触发器及删除Mysql触发器作了详细的介绍&#xff0c;希望对您有所帮助。1、创建Mysql触发器:语法:CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_nameFOR EACH ROWBEGINtrigger_stmtEND&a…

Android 单例模式的正确姿势

单例模式是使用得最多的设计模式&#xff0c;模版代码也很多。但是如果使用不当还是容易出问题。 DCL模式(双重检查锁定模式)的正确使用方式 一般我们使用DCL方法来实现单例模式时都是这样的模版代码&#xff1a; private static Singleton mSingleton null; private Singleto…

vscode 断点调试知乎_VSCode原理解析 断点调试

背景 今年年初,有幸参与了IDE 共建项目组, 打造阿里生态体系内的公共IDE底层,而作为一款面向开发者的IDE,调试能力的支持一定程度上决定着一款IDE的开发体验;VSCode作为微软体系下一款当前最热的IDE开发工具,在调试领域上的探索实践是很好的学习案例,有道是:借他山之石,…

jta mysql_Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务

DataSource 配置1 packagecom.cheng.dynamic.config;23 importjava.util.Properties;45 importjavax.sql.DataSource;67 importorg.springframework.beans.factory.annotation.Autowired;8 importorg.springframework.boot.jta.atomikos.AtomikosDataSourceBean;9 importorg.sp…

linux mysql 查看死锁_MySQL 死锁的详细分析方法

用数据库的时候&#xff0c;偶尔会出现死锁&#xff0c;针对我们的业务系统&#xff0c;出现死锁的直接结果就是系统卡顿、客户找事儿&#xff0c;所以我们也在想尽全力的消除掉数据库的死锁。出现死锁的时候&#xff0c;如果只是想解锁&#xff0c;用show full processlist看下…

echarts的日常(教学篇)

1.开发流程2.案例 2.1 入门demo2.2 echarts的常用属性。 1 title &#xff08;标题&#xff09;2 lengend &#xff08;切换组件图例&#xff09;3 grid (网格)4 xAxis&#xff08;x轴&#xff09;5 yAxis&#xff08;y轴&#xff09;6 toolbox (工具包)7 tooltip (鼠标悬停提示…