CCF 差分约束--201809再卖菜
问题描述
输入格式
输出格式
样例输入
样例输出
数据规模和约定
解析:
由于是去尾法取整,所以这题的每组相邻的商店菜价总和是由区间限制的,可以利用差分约束来做。差分约束有一般有两种求解方式,求最大值,求最小值。这里求字典序最小即要求最小值,可以利用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
CCF 差分约束--201809再卖菜相关推荐
- [差分约束] AcWing-393 雇佣收银员 AcWing-2128 狡猾的商人 AcWing-3265 再卖菜
差分约束的大概样子 (大概) 差分约束一般是由特殊的n元一次不等式组组成的,它包含N个变量X1-Xn和M个约束条件,而且每个约束条件都是由两个变量做差组成的,形如,其中的ck是常数,它需要我们找到一组 ...
- CCF201809-4 再卖菜
问题描述: 试题编号: 201809-4 试题名称: 再卖菜 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一 ...
- CCF201809-4 再卖菜(100分)【DFS】
试题编号: 201809-4 试题名称: 再卖菜 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第 ...
- [csp-201809-4]再卖菜 差分约束or记忆化搜索
先更新第一个做法:差分约束 转化成最长路,求出的每一个解是满足差分方程的最小值 spfa求最短路 对于边(x->y) 有: 1 if(dis[y] > dis[x] + a[i].d) d ...
- CSP认证201809-4 再卖菜[C++题解]:差分约束、前缀和
文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 对于a0,a1,...,ana_0, a_1,...,a_na0,a1,...,an,经过计算相邻的数的平均值得到b0,b1, ...
- 180904 再卖菜 ccf
思路 dfs+去重 关键 满分的关键在于不同的前缀可能会遇到相同的情况,要直接排除这些情况,避免重复计算(单纯dfs只有80分) 实现 这里采用数组f来记录各种情况,通过traceback函数回溯 1 ...
- CCF201809-4 再卖菜
问题描述: AC代码: 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include ...
- 【CCF】 201809-1 卖菜
试题编号: 201809-1 试题名称: 卖菜 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第一天,每个商 ...
- CCF CSP 201809-1 卖菜
题目链接:http://118.190.20.162/view.page?gpid=T79 问题描述 试题编号: 201809-1 试题名称: 卖菜 时间限制: 1.0s 内存限制: 256.0MB ...
最新文章
- win7 64位系统oracle客户端访问远程数据库
- 【转】以操作系统的角度述说线程与进程
- qt绘制一圈圆_Qt绘制圆
- zbb20180117 汉字转拼音 pinyin4
- 《AlphaGo世纪对决》与周志华《机器学习》观后感
- centos8.2安装ovirt
- 【英语学习】【Daily English】U10 Education L01 Is this certificate a must?
- cup first world_LOONCUP – The world's first SMART menstrual cup.
- JQuery Mobile iscroll插件使用教程及注意事项
- 【CentOS 7笔记43】,防火墙和iptables filter表#
- CI框架的使用-环境搭建
- 如何用photoshop做24色环_色相环:用PS做色相环教程
- android允许应用在后台弹出界面,Android部分手机“后台弹出界面权限”解决方案...
- 【idea】智能花盆
- 【cocos creater】5.仿《弓箭传说》- 创建虚拟遥感
- NVIDIA 安装 CUDA
- maya blend shape
- 常见的前端考试面试题目【vue,react,css,six】
- win11 安装make (gnu make)
- 校园水卡-数据分析+破解思路
热门文章
- 【IT笔试面试题整理】有序数组生成最小高度二叉树
- Eigen密集矩阵求解 1 - 线性代数及矩阵分解
- 数学建模算法:支持向量机_从零开始的算法:支持向量机
- fitbit手表中文说明书_使用机器学习预测Fitbit睡眠分数
- 详解python3如何调用c语言代码
- DCASE挑战赛原始提案文件(详细信息)
- 心灵之光、思想之树:推荐《作家曰》
- python类定义学生信息_Python学生信息管理系统(注释最详细,小白都看的懂)
- java 向上抛异常_java throws 向上抛出的概念问题
- ubuntu 安装kde桌面_在Ubuntu 20.04系统上安装KDE Plasma Desktop的方法