609: [Usaco2008 Feb]Eating Together麻烦的聚餐

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1198  Solved: 711
[Submit][Status][Discuss]

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

5
1
3
2
1
1
输入说明:

队列中共有5头奶牛,第1头以及最后2头奶牛被设定为第一批用餐,第2头奶牛的预设是第三批用餐,第3头则为第二批用餐。

Sample Output

1

输出说明:

如果FJ想把当前队列改成一个不下降序列,他至少要改2头奶牛的编号,一种可行的方案是:把队伍中2头编号不是1的奶牛的编号都改成1。不过,如果FJ选择把第1头奶牛的编号改成3就能把奶牛们的队伍改造成一个合法的不上升序列了。

HINT

Source

Silver

正着反着求两次最长不下降子序列即可。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cstdlib>
 7 #define maxn 30000+100
 8 #define inf 0x7fffffff
 9 using namespace std;
10 int a[maxn],f[maxn];
11 int main()
12 {
13     int n,ans=-inf;
14     cin>>n;
15     for(int i=1;i<=n;++i) f[i]=1;
16     for(int i=1;i<=n;++i) scanf("%d",&a[i]);
17     for(int i=2;i<=n;++i)
18       for(int j=1;j<i;++j)
19        if((a[i]>=a[j])&&(f[i]<f[j]+1))
20        {
21           f[i]=f[j]+1;
22           if(f[i]>ans) ans=f[i];
23        }
24     //for(int i=1;i<=n;++i) printf("%d\n",f[i]);
25     for(int i=1;i<=n;++i) f[i]=1;
26     for(int i=n-1;i>=1;--i)
27       for(int j=n;j>i;j--)
28         if((a[i]>=a[j])&&(f[i]<f[j]+1))
29         {
30             f[i]=f[j]+1;
31             if(f[i]>ans) ans=f[i];
32         }
33     cout<<n-ans;
34 }

View Code

nlogn

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define maxn 4100000
 7 using namespace std;
 8 int a[maxn],b[maxn],c[maxn];
 9 int main()
10 {
11     int n,len1,len2;
12     cin>>n;
13     for(int i=1;i<=n;++i) scanf("%d",&a[i]);
14     c[0]=-1;c[1]=a[1];len1=1;
15     for(int i=2;i<=n;++i)
16     {
17         if(a[i]>=c[len1]) c[++len1]=a[i];
18         else
19         {
20             int pos=upper_bound(c+1,c+len1+1,a[i])-c;
21             c[pos]=a[i];
22         }
23     }
24     for(int i=1;i<=n;++i) c[i]=-1;
25     c[0]=-1;c[1]=a[n];len2=1;
26     for(int i=n-1;i>=1;--i)
27     {
28         if(a[i]>=c[len2]) c[++len2]=a[i];
29         else
30         {
31             int pos=upper_bound(c+1,c+len2+1,a[i])-c;
32             c[pos]=a[i];
33         }
34     }
35     int ans=max(len1,len2);
36     cout<<n-ans;
37 } 

View Code

转载于:https://www.cnblogs.com/TYH-TYH/p/4874139.html

BZOJ【1609】 麻烦的聚餐相关推荐

  1. [BZOJ] 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐

    1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1646  Solv ...

  2. bzoj 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐(DP)

    1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1616  Solv ...

  3. 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐

    1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1010  Solv ...

  4. BZOJ 1609 [Usaco2008 Feb]Eating Together麻烦的聚餐:LIS LDS (nlogn)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1609 题意: 给你一个只由数字"1,2,3"组成的序列a[i],共n个 ...

  5. [Usaco2008 Feb]Eating Together麻烦的聚餐

    题目描述 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的位置就归第2批 ...

  6. [Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]

    Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...

  7. 晚餐队列安排‖(麻烦的聚餐)

    描述 为了避免餐厅过分拥挤,FJ要求奶牛们分 33 批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想,所有第 33 批就餐的奶牛排在队尾,队伍的 前端由设定为第1批就餐的奶牛占据,中间的位 ...

  8. BZOJ 1609 Usaco Eating Together

    看完题目第一眼的感觉就是求一个最长不上升子序列 和 最长不下降子序列 O(N^2)一定是跑不过去的 所以要写个O(NlogN)的算法 结果成功写挫~ 思维难度不大,注意二分容易写爆炸. #includ ...

  9. 题目推荐—BZOJ 水题推荐

    [bzoj1756]Vijos1083小白逛公园 裸题- -..线段树维护lmax,rmax,max,sum然后搞之.. [Ahoi2008]Meet 紧急集合 求两两点的lca然后会发现必然有两个l ...

  10. genymotion局域网访问_Genymotion与本地电脑共享文件夹的方法

    [USACO 3.2]Sweet Butter(最短路) 题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其 ...

最新文章

  1. 02.Web大前端时代之:HTML5+CSS3入门系列~H5结构元素
  2. CTF——angr使用学习记录
  3. 基数排序及其思想 C++代码实现及分析 恋上数据结构笔记
  4. 轩逸车联网功能怎么用_手机上面的NFC功能怎么用的
  5. 还有什么芯片没涨?ST、ON、Microchip、Xilinx、东芝开启新一轮涨价潮
  6. 热血江湖最新服务器,《热血江湖》2020年6月2日部分服务器数据互通公告
  7. 《并行计算的编程模型》一3.1 引言
  8. Visual C++ 2011-5-18
  9. 计算机控制实验报告组态软件学习,单片机与MCGS组态综合实验系统 教学软件 实训系统...
  10. labview支持python免费_ni labview 2018
  11. 免费的网络验证系统插件
  12. 赛式方法论:为什么你的游戏做不完、做得烂?
  13. 机器学习实战(七):Ensemble Learning and Random Forests
  14. 2023年软考考试时间及相关安排
  15. Android 通过shape画线,1条线2种颜色,左边线条和背景色一致,右边线条为divider颜色
  16. 2013-2014-1(实变函数56, 常微分方程64)
  17. 2021年质量员-装饰方向-岗位技能(质量员)最新解析及质量员-装饰方向-岗位技能(质量员)试题及解析
  18. PHP 免费获取手机号码归属地
  19. 华为服务器显示100错误,华为12708风扇狂转100%故障排除
  20. SMDS:交换式多兆位数据服务--网络大典

热门文章

  1. [原创] 测试策略是什么?
  2. 拦截器(Interceptor)和过滤器(Filter)的区别
  3. SpringBoot❤SpringClould常用注解史诗级汇总
  4. QA: c# IHttpFactory配置代理或者HttpClient配置代理
  5. 37. Never redefine a function's iherited default parameter value.
  6. Java滑动窗口的最大值
  7. Python实现笑脸检测+人脸口罩检测
  8. php 查看常量值,[thinkphp]查看thinkphp系统定义的常量值
  9. 中科院计算机考研对外调剂吗,考研调剂信息:2020年中科院接收调剂研究生!...
  10. java数据流更新文件内容,数据流 · Java 文件操作 · 看云