[wzoi]Help Bubu

题目描述:

Bubu的书架上乱成一团了!请帮助他一下吧!

他的书架上一共有n本书。我们定义混乱值是连续相同高度书本的段数。例如,如果输的高度是30,30,31,31,32,那么混乱值为3,30,32,32,31的混乱度也是3,但31,32,31,32,31的混乱度为5,这实在是太乱了。Bubu想尽可能的减少混乱度,但他有点累了,所以他决定最多取出k本书,在随意将它们放到书架上。你能帮助他吗?

输入格式:

最多会有20组测试数据。每组测试数据开头为两个整数n,k,表示总共有n本书,最多可以进行k次搬书操作。接下来一行有n个整数,表示每本书的高度,从左到右。每本书的高度是25到32间的整数。最后一组数据后有一行n=k=0。

输出格式:

对于每一组数据,输出Case标号和最终最小的混乱度。在每组数据后打印一个空行。

样例输入:
复制代码
5 2 
25 25 32 32 25
5 1 
25 26 25 26 25
0 0 
样例输出:
复制代码
Case 1: 2

Case 2: 3
提示:

时间限制: 1000ms

空间限制: 256MB

系统90分 :
复制代码
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define rint register int
using namespace std;

int n, m, st, u, ans, x;
int a[101], f[2][101][256][9], g[256];

void se(int x)
{
	for(rint i = 0; i <= m; i++)
		for(rint j = 0; j < 256; j++)
			for(rint k = 0; k <= 8; k++)
				f[x][i][j][k] = inf;
}

int main()
{
	for(rint i = 0; i < 256; i++)
		for(rint j = 0; j < 8; j++)
			if(i & (1 << j)) g[i]++;
	while(scanf("%d%d", &n, &m) != EOF)
	{
		if(!n && !m) break;
		st = 0;
		for(rint i = 1; i <= n; i++)
		{
			scanf("%d", &a[i]);
			a[i] -= 25;
			st |= (1 << a[i]);
		}
		u = 0;
		se(u);
		f[u][0][0][8] = 0;
		for(int i = 0; i < n; i++)
		{
			int t = a[i + 1];
			u ^= 1;
			se(u);
			for(rint j = 0; j <= min(i, m); j++)
				for(rint k = 0; k < 256; k++)
					for(rint l = 0; l <= 8; l++)
					{
						int tmp = f[u ^ 1][j][k][l];
						if(tmp == inf) continue;
						f[u][j + 1][k][l] = min(f[u][j + 1][k][l], tmp);
						if(l != t) f[u][j][k | (1 << t)][t] = min(f[u][j][k | (1 << t)][t], tmp + 1);
						else f[u][j][k][t] = min(f[u][j][k][t], tmp);
					}
		}
		ans = inf;
		for(rint i = 0; i <= m; i++)
			for(rint j = 0; j < 256; j++)
				for(rint k = 0 ; k <= 8; k++)
				{
					if(f[u][i][j][k] == inf) continue;
					int t = st ^ j;
					if(f[u][i][j][k] + g[t] < ans) ans = f[u][i][j][k] + g[t];
				}
		printf("Case %d: %d\n\n", ++x, ans);
	}
	return 0;
}
优化100分:

太太太难了!!!!!!加个优化吧!!!(参考生姜666的CSDN吐槽一下!)

#include<bits/stdc++.h>

#pragma GCC optimize(1)

#pragma GCC optimize(2)

#pragma GCC optimize(3)

#pragma GCC optimize("Ofast")

#pragma GCC optimize("inline")

#pragma GCC optimize("-fgcse")

#pragma GCC optimize("-fgcse-lm")

#pragma GCC optimize("-fipa-sra")

#pragma GCC optimize("-ftree-pre")

#pragma GCC optimize("-ftree-vrp")

#pragma GCC optimize("-fpeephole2")

#pragma GCC optimize("-ffast-math")

#pragma GCC optimize("-fsched-spec")

#pragma GCC optimize("unroll-loops")

#pragma GCC optimize("-falign-jumps")

#pragma GCC optimize("-falign-loops")

#pragma GCC optimize("-falign-labels")

#pragma GCC optimize("-fdevirtualize")

#pragma GCC optimize("-fcaller-saves")

#pragma GCC optimize("-fcrossjumping")

#pragma GCC optimize("-fthread-jumps")

#pragma GCC optimize("-funroll-loops")

#pragma GCC optimize("-freorder-blocks")

#pragma GCC optimize("-fschedule-insns")

#pragma GCC optimize("inline-functions")

#pragma GCC optimize("-ftree-tail-merge")

#pragma GCC optimize("-fschedule-insns2")

#pragma GCC optimize("-fstrict-aliasing")

#pragma GCC optimize("-falign-functions")

#pragma GCC optimize("-fcse-follow-jumps")

#pragma GCC optimize("-fsched-interblock")

#pragma GCC optimize("-fpartial-inlining")

#pragma GCC optimize("no-stack-protector")

#pragma GCC optimize("-freorder-functions")

#pragma GCC optimize("-findirect-inlining")

#pragma GCC optimize("-fhoist-adjacent-loads")

#pragma GCC optimize("-frerun-cse-after-loop")

#pragma GCC optimize("inline-small-functions")

#pragma GCC optimize("-finline-small-functions")

#pragma GCC optimize("-ftree-switch-conversion")

#pragma GCC optimize("-foptimize-sibling-calls")

#pragma GCC optimize("-fexpensive-optimizations")

#pragma GCC optimize("inline-functions-called-once")

#pragma GCC optimize("-fdelete-null-pointer-checks")

#define inf 0x3f3f3f3f

#define rint register int

using namespace std;

int n, m, st, u, ans, x;

int a[101], f[2][101][256][9], g[256];

void se(int x)

{

for(rint i = 0; i <= m; i++)

for(rint j = 0; j < 256; j++)

for(rint k = 0; k <= 8; k++)

f[x][i][j][k] = inf;

}

int main()

{

for(rint i = 0; i < 256; i++)

for(rint j = 0; j < 8; j++)

if(i & (1 << j)) g[i]++;

while(scanf("%d%d", &n, &m) != EOF)

{

if(!n && !m) break;

st = 0;

for(rint i = 1; i <= n; i++)

{

scanf("%d", &a[i]);

a[i] -= 25;

st |= (1 << a[i]);

}

u = 0;

se(u);

f[u][0][0][8] = 0;

for(int i = 0; i < n; i++)

{

int t = a[i + 1];

u ^= 1;

se(u);

for(rint j = 0; j <= min(i, m); j++)

for(rint k = 0; k < 256; k++)

for(rint l = 0; l <= 8; l++)

{

int tmp = f[u ^ 1][j][k][l];

if(tmp == inf) continue;

f[u][j + 1][k][l] = min(f[u][j + 1][k][l], tmp);

if(l != t) f[u][j][k | (1 << t)][t] = min(f[u][j][k | (1 << t)][t], tmp + 1);

else f[u][j][k][t] = min(f[u][j][k][t], tmp);

}

}

ans = inf;

for(rint i = 0; i <= m; i++)

for(rint j = 0; j < 256; j++)

for(rint k = 0 ; k <= 8; k++)

{

if(f[u][i][j][k] == inf) continue;

int t = st ^ j;

if(f[u][i][j][k] + g[t] < ans) ans = f[u][i][j][k] + g[t];

}

printf("Case %d: %d\n\n", ++x, ans);

}

return 0;

}

AC啦!

相关推荐
SNAKEpc121386 分钟前
QML和Qt Quick
c++·qt
PH_modest6 分钟前
【Qt跬步积累】—— 初识Qt
开发语言·qt
hansang_IR16 分钟前
【题解】洛谷 P4286 [SHOI2008] 安全的航线 [递归分治]
c++·数学·算法·dfs·题解·向量·点积
乐迪信息16 分钟前
乐迪信息:AI摄像机在智慧煤矿人员安全与行为识别中的技术应用
大数据·人工智能·算法·安全·视觉检测
GanGuaGua24 分钟前
Linux系统:线程的互斥和安全
linux·运维·服务器·c语言·c++·安全
怀旧,33 分钟前
【C++】18. 红⿊树实现
开发语言·c++
lsnm33 分钟前
【LINUX网络】IP——网络层
linux·服务器·网络·c++·网络协议·tcp/ip
多恩Stone44 分钟前
【3DV 进阶-2】Hunyuan3D2.1 训练代码详细理解下-数据读取流程
人工智能·python·算法·3d·aigc
宁静致远20211 小时前
【C++设计模式】第三篇:观察者模式(别名:发布-订阅模式、模型-视图模式、源-监听器模式)
c++·观察者模式·设计模式
xiaopengbc1 小时前
在 Python 中实现观察者模式的具体步骤是什么?
开发语言·python·观察者模式