CCF 差分约束--201809再卖菜

问题描述

在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。   第一天,每个商店都自己定了一个正整数的价格。店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己和相邻商店的价格调整自己的价格。具体的,每家商店都会将第二天的菜价设置为自己和相邻商店第一天菜价的平均值(用去尾法取整)。   注意,编号为1的商店只有一个相邻的商店2,编号为n的商店只有一个相邻的商店n-1,其他编号为i的商店有两个相邻的商店i-1和i+1。   给定第二天各个商店的菜价,可能存在不同的符合要求的第一天的菜价,请找到符合要求的第一天菜价中字典序最小的一种。   字典序大小的定义:对于两个不同的价格序列(a1, a2, ..., an)和(b1, b2, b3, ..., bn),若存在i (i>=1), 使得ai<bi,且对于所有j<i,aj=bj,则认为第一个序列的字典序小于第二个序列。

输入格式

输入的第一行包含一个整数n,表示商店的数量。   第二行包含n个正整数,依次表示每个商店第二天的菜价。

输出格式

输出一行,包含n个正整数,依次表示每个商店第一天的菜价。

样例输入

8 2 2 1 3 4 9 10 13

样例输出

2 2 2 1 6 5 16 10

数据规模和约定

对于30%的评测用例,2<=n<=5,第二天每个商店的菜价为不超过10的正整数;   对于60%的评测用例,2<=n<=20,第二天每个商店的菜价为不超过100的正整数;   对于所有评测用例,2<=n<=300,第二天每个商店的菜价为不超过100的正整数。   请注意,以上都是给的第二天菜价的范围,第一天菜价可能会超过此范围。

解析:

  由于是去尾法取整,所以这题的每组相邻的商店菜价总和是由区间限制的,可以利用差分约束来做。差分约束有一般有两种求解方式,求最大值,求最小值。这里求字典序最小即要求最小值,可以利用spfa()求最长路径(不理解的戳这里)。建图还是采用我个人最喜欢的链式向前星(不懂戳这里)。

  PS:链接里的大概意思是,求最长路的松弛操作是if (dist[end]<dist[sta]+边权值){ dist[end]=dist[sta]+权值; },求出的dist[end]的解是满足约束条件(>=dist[sta]+权值)中最小的(因为取的是等号,还可能存在比这个更大的解)。求最大值的原理类似。

 1 #include <iostream>
 2 #include <queue>
 3 #include <cstring>
 4 using namespace std;
 5 struct Edge{
 6     int to;
 7     int next;//与当前边起点一样的另一条边的位置 
 8     int v;
 9 }edge[2006]; //链式向前星:每个节点存一条边; 
10 int n=0,cur=0; //cur当前已有边的个数 
11 int a[305],dist[306],vis[305],head[305],inq[305];
12 //head[i]以i为起点的边最大的编号 
13 void addedge(int from,int to,int w)
14 {
15     edge[cur].next=head[from];
16     edge[cur].to=to;
17     edge[cur].v=w;//路径权值 
18     head[from]=cur++;//当前节点变为头结点 
19 }
20 void spfa()//求最长路 
21 {
22     queue<int> q;
23     for(int i=0;i<n+1;++i)
24     {
25         q.push(i);
26         vis[i]=1;
27         dist[i]=0;
28         inq[i]=1;
29     }
30     while(!q.empty())
31     {
32         int x=q.front();
33         q.pop();
34         inq[x]++;
35         vis[x]=0;
36         if(inq[x]>n){//访问某一节点过多,存在正环,无解 
37             cout<<"no answer"<<endl;
38             return ;
39         }
40         for(int i=head[x];i!=-1;i=edge[i].next)//遍历与该节点相连的各边 
41         {
42             int nx=edge[i].to;
43             if(dist[nx]<dist[x]+edge[i].v)
44             {
45                 dist[nx]=dist[x]+edge[i].v;
46                 if(!vis[nx]){
47                     vis[nx]=1;
48                     q.push(nx);
49                 }
50             }
51         }
52     }
53     return ;
54 }
55 int main()
56 {    //解除cin cout 的绑定,提高输入输出效率;这个可以当模板记住,当然直接用scanf和print也可以。 
57     ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); 
58     memset(head,-1,sizeof(head));//head    全部初始为-1 
59     cin>>n;
60     for(int i=1;i<n+1;++i)
61         cin>> a[i];//第二天的菜价
62     for(int i=0;i<n-2;++i)
63     {
64         addedge(i+3,i,-(a[i+2]*3+2));//从第一个三个相邻开始,直到最后一个三个三个相邻 
65         addedge(i,i+3,a[i+2]*3);    
66     } 
67     //首末两个相邻,特殊处理 
68     addedge(2,0,-(a[1]*2+1));
69     addedge(0,2,a[1]*2); //首两个 
70     addedge(n,n-2,-(a[n]*2+1));
71     addedge(n-2,n,a[n]*2); //结尾两个
72     for(int i=1;i<n+1;++i)
73     {
74         addedge(i-1,i,1); //每个菜价都要大于1 
75     } 
76     spfa();
77     a[1]=dist[1];
78     for(int i=2;i<n+1;++i)
79         a[i]=dist[i]-dist[i-1];
80     cout<<a[1];
81     for(int i=2;i<n+1;++i)
82         cout<<' '<<a[i];
83     cout<<endl;
84     return 0;
85 } 

 (`・ω・´)ゞ敬礼っ

转载于:https://www.cnblogs.com/GorgeousBankarian/p/10403920.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Express + Element-ui 实现图片/文件上传

使用第三方插件 formidable 处理表单数据/文件 Express 4 以前&#xff0c;我们通常使用 req.files 来对请求中的文件进行处理&#xff0c;但在 Express 4 中这种用法已经被抛弃&#xff0c;默认情况下 req.files 在 req 对象上不再可用。官方推荐我们使用第三方中间件。 在这里…

weblogic12.1.3安装

weblogic weblogic12.1.3安装 环境&#xff1a; centos7.5 ip: 192.168.0.94 1、安装jdk 2、安装 weblogic 下载、解压安装包 wls1213_dev.zip unzip /application/weblogic12/wls1213_dev.zip mv wls12130 /application/weblogic12/ 配置环境变量 配置主机名解析 运行安装…

闭包那些事

定义&#xff1a; 在一个内部函数里&#xff0c; 对在外部作用域&#xff08;但不是在全局作用域&#xff09; 的变量进行引用&#xff0c; 那么内部函数就被认为是闭包&#xff08;closure&#xff09;。 例子&#xff1a; 1 def make_adder(addend):2 def adder(augend):3 …

10-04 矩形覆盖(斐波那契数列的应用)

题目描述&#xff1a; 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形&#xff0c;总共有多少种方法&#xff1f; 解题思路与代码&#xff1a; 1&#xff09; 排列组合&#xff1a; class Solution { public:int rectC…

Spring 源码分析 spring-core

先来看下 spring-core 的包结构 总共有6个模块&#xff0c;分别是 asm、cglib、core、lang、objenesis、util asm包&#xff1a; 用来操作字节码&#xff0c;动态生成类或者增强既有类的功能。主要包含以下这些类。详细功能。 https://www.ibm.com/developerworks/cn/java/j…

logging 模块

一、logging模块级别及常用函数 默认的level是logging.Warning,低于该级别的就不输出了。级别排序:Critical> Error > Warning > Info > Debug Logging.Formatter&#xff1a;配置日志的格式&#xff0c;在里面自定义设置日期和时间&#xff0c;输出日志的时候将会…

大数据项目中的QA需要迎接新的挑战

大数据项目中的QA需要迎接新的挑战根据IDC全球半年度大数据和分析支出指南的最新预测&#xff0c;到2022年全球大数据和业务分析解决方案的收入将达到2600亿美元。在大数据和业务分析解决方案上投资增长最快的行业包括银行&#xff08;复合年增长率13.3%&#xff09;、医疗、保…

spring源码分析之spring-core总结篇

1.spring-core概览 spring-core是spring框架的基石&#xff0c;它为spring框架提供了基础的支持。 spring-core从源码上看&#xff0c;分为6个package&#xff0c;分别是asm&#xff0c;cglib&#xff0c;core&#xff0c;lang&#xff0c;objenesis和util。 1.1 asm 关于as…

五分钟搞懂后缀数组!

为什么学后缀数组 后缀数组是一个比较强大的处理字符串的算法&#xff0c;是有关字符串的基础算法&#xff0c;所以必须掌握。 学会后缀自动机(SAM)就不用学后缀数组(SA)了&#xff1f;不&#xff0c;虽然SAM看起来更为强大和全面&#xff0c;但是有些SAM解决不了的问题能被SA解…

spring-core

spring最核心的组件是BeanFactory&#xff0c;看了源码才发现&#xff0c;BeanFactory并非定义在spring-core中&#xff0c;那spring-core都有啥东东&#xff1f; spring-core主要提供以下服务&#xff0c;为BeanFactory的定义提供基础服务。 1, ConversionService Conversi…

nginx配置静态文件过期时间

1. 编辑虚拟主机配置文件/usr/local/nginx/conf/vhosts/huangzhenping.conf 说明&#xff1a;采用location方式 12345678910location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${access_log off;expires 1d;}location ~ \.(js|css){access_log off;expires 1d;}2. 检查配置文件&#x…

vue 移动端在div上绑定click事件 失效

在.vue的文件中使用了better-scroll&#xff0c;在div标签上绑定click事件后&#xff0c;无效。 原因&#xff1a;使用了better-scroll&#xff0c;默认它会阻止touch事件。所以在配置中需要加上click: true 即可解决 mounted(){this.$nextTick(() > {let bscrollDom this.…

Java中的钩子方法

钩子方法是啥 钩子顾名思义就是用来挂东西的。那么要挂东西必须有个被挂的东西&#xff0c;要不就是铁环、要不就是墙的边沿。所以要能挂住东西必须要有个被勾住的铁环&#xff0c;要一个钩子。那么在java中也是同样的原理&#xff0c;你首先需要一个被挂在的东西&#xff0c;一…

启动tomcat出现too many connections的原因及解决方法

感谢分享&#xff0c;原文地址&#xff1a;http://blog.sina.com.cn/s/blog_e7e07ec30102vsba.html一、原因 产生too many connections 的直接原因是因为数据库提供的连接被全部占满了。数据库可以提供多少连接&#xff0c;可以再my.cnf(linux)或者my.ini(windows)下设定。这个…

Spring Beans 初始化流程分析

测试用例 依然使用这个官网上的用例&#xff0c;来进行调试&#xff1b; Person.java package org.shangyang.spring.container;/**- - author shangyang**/public class Person {String name;Person spouse;public String getName() {return name;}public void setName(Stri…

剑指offer(65)矩阵中的路径

题目描述 请设计一个函数&#xff0c;用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始&#xff0c;每一步可以在矩阵中向左&#xff0c;向右&#xff0c;向上&#xff0c;向下移动一个格子。如果一条路径经过了矩阵中的某一个…

VSCode中怎么改变文件夹的图标

昨天更新了VSCode后我的文件夹图标莫名其妙的没有了&#xff0c;变成了下图这样 看着真的让我难受的头皮发麻&#xff0c;本来打代码就头发少&#xff0c;难道非要让我变成秃头&#xff0c;不可能不可能&#xff0c;所以我找了找怎么解决 来&#xff0c;各位看官上眼 如图所示 …

jdk1.8以前不建议使用其自带的Base64来加解密

JDK1.8之前的base64是内部测试使用的代码&#xff0c;不建议生产环境使用&#xff0c;而且未来可能会移除&#xff0c; JDK1.8提供最新可以正式使用的Base64类&#xff0c; 不要使用JDK中自带的sun.misc.BASE64Decoder这个类去BASE64&#xff0c; 这个会在后面多加换行。使用ap…

Redis的五大数据类型

1.String&#xff08;字符串&#xff09; String是Redis最基本的类型&#xff0c;一个Key对应一个Value。 String类型是二进制安全的&#xff0c;意思是Redis的String可以包含任何数据&#xff0c;比如jpg图片或者序列化的对象。 String类型是Redis最基本的数据类型&#xff0c…