[Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]
Description
为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐。每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的位置就归第2批就餐的奶牛了。由于奶牛们不理解FJ的安排,晚饭前的排队成了一个大麻烦。 第i头奶牛有一张标明她用餐批次D_i(1 <= D_i <= 3)的卡片。虽然所有N(1 <= N <= 30,000)头奶牛排成了很整齐的队伍但谁都看得出来,卡片上的号码是完全杂乱无章的。 在若干次混乱的重新排队后,FJ找到了一种简单些的方法:奶牛们不动,他沿着队伍从头到尾走一遍把那些他认为排错队的奶牛卡片上的编号改掉,最终得到一个他想要的每个组中的奶牛都站在一起的队列,例如111222333或者333222111。哦,你也发现了,FJ不反对一条前后颠倒的队列,那样他可以让所有奶牛向后转,然后按正常顺序进入餐厅。 你也晓得,FJ是个很懒的人。他想知道,如果他想达到目的,那么他最少得改多少头奶牛卡片上的编号。所有奶牛在FJ改卡片编号的时候,都不会挪位置。
Input
第1行: 1个整数:N 第2..N+1行: 第i+1行是1个整数,为第i头奶牛的用餐批次D_i
Output
第1行: 输出1个整数,为FJ最少要改几头奶牛卡片上的编号,才能让编号变成他设想中的样子
Sample Input
1
3
2
1
1
输入说明:
队列中共有5头奶牛,第1头以及最后2头奶牛被设定为第一批用餐,第2头奶牛的预设是第三批用餐,第3头则为第二批用餐。
Sample Output
输出说明:
如果FJ想把当前队列改成一个不下降序列,他至少要改2头奶牛的编号,一种可行的方案是:把队伍中2头编号不是1的奶牛的编号都改成1。不过,如果FJ选择把第1头奶牛的编号改成3就能把奶牛们的队伍改造成一个合法的不上升序列了。
题解:
求出最长不下降子序列,正反各做一次,求最大的长度;
答案就为 n-maxl;
此题学习一下最长不下降子序列O(nlogn)的算法;
推导可见白书或是这里!
我觉得可以通过理解代码理解原理:
for(int i=1;i<=n;i++)
{
int k=lower_bound(g+1,g+n+1,a[i],cmp2)-g;
f[i]=k;
g[k]=a[i];
ans=max(ans,f[i]);
}
g可以理解为用来储存子序列,f为最长不下降子序列的长度;
lower_bound是在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置,具体的可以看这里
对于程序本身,我们可以这样理解:
找到第一个比a[i]大的元素的位置k,我们可以认为k就为当前找到的最长不下降子序列的长度;
用f记录下k;
把g[k]插在a[i]的前面(并不是替换),这样就可以前面的元素尽可能小,使下一步搜出来的k尽可能大了;
附上代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
bool cmp1(int a,int b)
{
return a<=b;
}
bool cmp2(int a,int b)
{
return a>=b;
}
int n,a[30003],f[30003],g[30003],ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
g[i]=INF;
for(int i=1;i<=n;i++)
{
int k=lower_bound(g+1,g+n+1,a[i],cmp1)-g;
f[i]=k;
g[k]=a[i];
ans=max(ans,f[i]);
}
for(int i=1;i<=n;i++)
g[i]=-INF;
for(int i=1;i<=n;i++)
{
int k=lower_bound(g+1,g+n+1,a[i],cmp2)-g;
f[i]=k;
g[k]=a[i];
ans=max(ans,f[i]);
}
printf("%d\n",n-ans);
return 0;
}
因为在某套模拟赛中又出现了这题原题,然后特别以为能特别轻松的拿满分来着,愉快的biabia之后,发现WA掉了!
说一下自己发现的细节:
我试着用了 挑战程序设计竞赛 那本提供的代码打了一遍,QAQ WA得特别的惨
注意的细节就是 k=lower_bound()-g;的值的问题,
感觉自己对于指针这种东西一直不是太懂,自己还是照着标准的打好了
读入的时候 从1开始读;
bool cmp(int a,int b){ return a<=b; }
for(int i=1;i<=n;i++) g[i] = INF;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++){
int k=lower_bound(g+1,g+n+1,a[i],cmp)-g;
f[i]=k;
g[k]=a[i];
ans=max(ans,f[i]);
}
注意这里的cmp一定要定义,貌似没有定义一下会发生奇怪的事情;(不过有可能是因为我打开的方式不对)
然后就是一定不要作死按照书上的方式写!不就是多个f数组么- -
[Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]的更多相关文章
- Bzoj 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 二分
1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1272 Solve ...
- BZOJ1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 938 Solved ...
- BZOJ 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐( LIS )
求LIS , 然后用 n 减去即为answer ---------------------------------------------------------------------------- ...
- BZOJ 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按F ...
- 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1010 Solv ...
- [Usaco2008 Feb]Eating Together麻烦的聚餐
Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...
- [BZOJ1609] [Usaco2008 Feb] Eating Together麻烦的聚餐 (dp)
Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...
- 【BZOJ】1609: [Usaco2008 Feb]Eating Together麻烦的聚餐(dp+被坑)
http://www.lydsy.com/JudgeOnline/problem.php?id=1609 首先我不得不说,我被这题坑了.题目前边没有说可以不需要3种牛都有啊!!!!!!!!然后我一直在 ...
- 【bzoj1609】[Usaco2008 Feb]Eating Together麻烦的聚餐 dp
题目描述 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的位置就归第2批 ...
随机推荐
- Intel 80x86 寻址模式
随着进一步的研究,我们会逐渐接触到你的电脑配置模式的内在联系,和设计原则.在这些,解决计算机是一个非常重要的概念,我们需要很好地理解了什么. 一.预赛: (1)作数 在接触寻址方式之前,我们还要先了解 ...
- ios swift学习日记1-Swift 初见
最近ios的swift语言似乎火了,我没有objectc基金会,但在此之前有cjava的基础的.从这几天開始学习ios的swift语言.后期以博客形式公布.这里提供一本翻译的英文版的swif书籍. 还 ...
- 大数据系列修炼-Scala课程03
前言 今天上班看了很多关于前端js,jQuery.bootstrap.js以及springMVC看得迷迷糊糊的,毕竟以前很少去学习前端的技术,所有看得有点困,还好看得比较多,回家后也开始学习关于Sca ...
- linux_vim_最佳快捷键
如何使用vi文本编辑器 vi由比尔·乔伊(Bill Joy)撰写,所有UNIX like均默认安装此文本编辑器.详细简介请点击维基中文. 1.首先复制一个文件到/tmp目录(本例中为复制根目录 ...
- ASP.NET 5- 1
ASP.NET 5 入门(1) - 建立和开发ASP.NET 5 项目 ASP.NET入门(1) - 建立和开发ASP.NET 5 项目 建立项目 首先,目前只有VS 2015支持开发最新的ASP ...
- Jenkins master在windows
Jenkins master在windows上安装 1 Jenkins Jenkins由以前的hudson更名而来.Jenkins的主要功能是监视重复工作的执行,例如软件工程的构建或在cron下设置的 ...
- 【LeetCode】 sort list 单清单归并
称号:Sort a linked list in O(n log n) time using constant space complexity. 思路:要求时间复杂度O(nlogn) 知识点:归并排 ...
- BZOJ 2120 色彩数 暴力
标题效果:给定一个序列,两种操作: 1.询[l,r]间隔多少个不同的号码 2.单点变化 n,m<=1W 树盖树?树董事长?因此不必! 暴力之前,这个问题2s,不想复杂!适当的水太! 离散化一下! ...
- IOS中TableView的使用(1) -创建一个简单的tableView
创建一个简单的tableView: #import <UIKit/UIKit.h> /*tableView 一定要遵守这两个协议: UITableViewDataSource,UITabl ...
- MVC自定义分页
MVC自定义分页 之前我发表了一篇MVC无刷新分页的文章,里面用的是MvcPager控件,但是那个受那个控件限制,传值只能用PagedList,各方面都受到了限制,自由度不够高,现在还是做MVC无刷新 ...