题目背景

BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题。

题目描述

N个偶像排成一列,他们来自M个不同的乐队。每个团队至少有一个偶像。

现在要求重新安排队列,使来自同一乐队的偶像连续的站在一起。重新安排的办法是,让若干偶像出列(剩下的偶像不动),然后让出列的偶像一个个归队到原来的空位,归队的位置任意。

请问最少让多少偶像出列?

输入输出格式

输入格式:

第一行2个整数N,M。

接下来N个行,每行一个整数a_i(1\le a_i \le M)a​i​​(1≤a​i​​≤M),表示队列中第i个偶像的团队编号。

输出格式:

一个整数,表示答案

输入输出样例

输入样例#1:

12 4
1
3
2
4
2
1
2
3
1
1
3
4

输出样例#1:

7

说明

【样例解释】

1  3   √
3  3
2 3 √ 4 4 2 4 √ 1 2 √ 2 2 3 2 √ 1 1 1 1 3 1 √ 4 1 √

【数据规模】

对于20%的数据,N≤20,M=2

对于40%的数据,N≤100,M≤4

对于70%的数据,N≤2000,M≤10

对于全部数据,1≤N≤105​​,M≤20

这竟然是一道签到题,我觉得自己可以滚回普及组了。

反过来考虑,要让最少的人出列就是让最多的人不出列(留下)。

看m数据范围就是状压dp。然后n。。发现n挺大的,如果能让最后主算法复杂度不带n是最好的,反正复杂度不能让n和(1<<m)相乘

我们预处理出tot[i][j]表示前i个人中,团队序号为j的人有多少个,复杂度O(nm)。

然后枚举每个状态,看看这个状态可以转移到那些状态。

用dp[i]表示第i个状态(如果 j 满足 (1<<(j-1)) & i != 0,则表示j这个团队的人全都排好了,而且位置在靠前的位置)可以留下的最多人数,然后就可以dp了。

for(int i=0;i<(1<<m);++i) {sum=0;for(int j=1;j<=m;++j) if(i&(1<<(j-1))) sum+=tot[n][j];l=sum;for(int j=1;j<=m;++j) {if(i&(1<<(j-1))) continue;r=sum+tot[n][j];dp[i|(1<<(j-1))]=max(dp[i|(1<<(j-1))],dp[i]+tot[r][j]-tot[l][j]);}ans=max(ans,dp[i]);
}

  

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e5+10,maxm=20,maxmi=1<<20;
int n,m,a[maxn],tot[maxn][maxm],dp[maxmi],ans;int aa;char cc;
int read() {aa=0;cc=getchar();while(cc<'0'||cc>'9') cc=getchar();while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();return aa;
}int main() {n=read();m=read();for(int i=1;i<=n;++i) {a[i]=read();for(int j=1;j<=m;++j) tot[i][j]=tot[i-1][j];tot[i][a[i]]++;}int sum,l,r;for(int i=0;i<(1<<m);++i) {sum=0;for(int j=1;j<=m;++j) if(i&(1<<(j-1))) sum+=tot[n][j];l=sum;for(int j=1;j<=m;++j) {if(i&(1<<(j-1))) continue;r=sum+tot[n][j];dp[i|(1<<(j-1))]=max(dp[i|(1<<(j-1))],dp[i]+tot[r][j]-tot[l][j]);}ans=max(ans,dp[i]);}printf("%d",n-ans);return 0;
}

  

转载于:https://www.cnblogs.com/Serene-shixinyi/p/7475529.html

洛谷P3694 邦邦的大合唱相关推荐

  1. 洛谷P1433 吃奶酪

    题链 排列 的 装压 两个同类型的状压 No Change G 邦邦的大合唱站队 题目描述 房间里放着 n 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 (0,0)点处. 输入格 ...

  2. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  3. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  4. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  5. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  6. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  7. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  8. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

  9. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

最新文章

  1. dirty_background_ration 与 /proc/sys/vm/dirty_ratio
  2. 编程艺术 二进制中1的个数
  3. Maven报错“未结束的字符串字面值”
  4. 《JavaScript入门经典(第6版)》——2.7 问答
  5. Android开发之Java的IO流读写的十种方法
  6. 小米3g刷高格固件_小米路由器3G刷了老毛子之后恢复官方固件
  7. Linux nc命令详解
  8. mysql创建数据库指定utf 8_MySQL创建数据库时指定编码utf8mb4和添加用户
  9. 详解Android常用抓包工具的使用方法、技巧-学习笔记20220416
  10. Java 常量字符串过长
  11. 【数据分析案例】如何定义你的“亲密关系”
  12. c语言 dct变换,汇编实现的DCT变换算法
  13. 【干货】python爬取《战狼2》电影短评论,生成图云
  14. win10 mysql 入站规则_WIn10防火墙入站规则设置无效
  15. Linux下通过vi修改只读文件
  16. 微信营销KPI考核标准有哪些?
  17. lept_json的学习之JSON
  18. MVGCN 人群流量预测模型 笔记
  19. 珍珠bead_珍珠果酱直播
  20. 测试开发之路:英雄迟暮,我心未老

热门文章

  1. innodb行锁理解
  2. 可靠性测试-故障模型库
  3. Linux系统安全工具之NMAP
  4. Entity Framework中IQueryable, IEnumerable, IList的区别(转自网络)
  5. SupeSite后台添加新闻增加【预览】功能
  6. Velocity模板(VM)语言介绍
  7. 用php实现动态产生xml文件以及从xml文件中抽取数据转化成html的
  8. 不是VIP用户也不怕 不需任何补丁屏蔽迅雷广告!
  9. 蘋果iPhone 3G S更出色
  10. JQUERY获取text,areatext,radio,checkbox,select值