化工厂装箱员 洛谷 p2530
题目描述
118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱员grant第1次顺序从流水线上取10个成品(如果一共不足10个,则全部取出),以后每一次把手中某种纯度的成品放进相应的箱子,然后再从流水线上顺序取一些成品,使手中保持10个成品(如果把剩下的全部取出不足10个,则全部取出),如果所有的成品都装进了箱子,那么grant的任务就完成了。
由于装箱是件非常累的事情,grant希望他能够以最少的装箱次数来完成他的任务,现在他请你编个程序帮助他。
输入输出格式
输入格式:
第1行为n(1<=n<=100),为成品的数量
以后n行,每行为一个大写字母A,B或C,表示成品的纯度。
输出格式:
仅一行,为grant需要的最少的装箱次数。
输入输出样例
输入样例#1:
11 A B C A B C A B C A B
输出样例#1:
3
用数组表示所有的状态,状态为当前拿到了第几个物品,同时现在手里有A类物品,B类物品,C类物品各几个,所以每次转移都是把一种东西放进去之后再取几件,然后就比较好写了
上代码:
#include<iostream>
#include<cstdio>
using namespace std;
int n,w[],f[][][][],t[],ans;
int read(){//read函数是对字符进行一下转变,变成数字
int x;char c=getchar();
while(c<'A'||c>'C') c=getchar();
x=c-'A'+;
return x;
} void dp(int cur,int nxt,int a,int b,int c,int k){//cur是当前状态的物品数,nxt转移后的状态的物品数,abc是三种物品在手中的数量,k是要放哪一种物品
int aa=a,bb=b,cc=c;
nxt=min(nxt,n);//不能超出
if(k==) aa=;
else if(k==) bb=;
else if(k==) cc=;
for(int i=cur+;i<=nxt;i++){
if(w[i]==) aa++;
else if(w[i]==) bb++;
else if(w[i]==) cc++;
}
f[nxt][aa][bb][cc]=min(f[nxt][aa][bb][cc],f[cur][a][b][c]+);//上一个状态的次数再多放一次
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
w[i]=read();
if(i<=){
t[w[i]]++;//先记录前十个物品三种各有几个
}
}
if(n<=){//小于十个就直接输出
for(int i=;i<=;i++){
ans+=(t[i]>?:);
}
printf("%d\n",ans);
return ;
} for(int i=;i<=n;i++){
for(int j=;j<=;j++){
for(int k=;k<=;k++){
for(int l=;l<=;l++){
f[i][j][k][l]=(<<);//初始化
}
}
}
}
f[][t[]][t[]][t[]]=;//初状态为零次, i<=10&&j<=t[1]&&k<=t[2]&&l<=t[3] 的状态不变为零,因为这些状态一定不是最优,所以不必初始化
for(int i=;i<=n;i++){
for(int j=;j<=;j++){
for(int k=;k<=;k++){
for(int l=;l<=;l++){
if(f[i][j][k][l]!=(<<)){//如果这个状态可以转移
if(j>){
dp(i,i+j,j,k,l,);//分别尝把每一种物品放回去进行状态进行转移
}
if(k>){
dp(i,i+k,j,k,l,);
}
if(l>){
dp(i,i+l,j,k,l,);
}
}
}
}
}
}
ans=(<<);
for(int j=;j<=;j++){
for(int k=;k<=;k++){
for(int l=;l<=;l++){
ans=min(ans,f[n][j][k][l]+(j>?:)+(k>?:)+(l>?:));//在所有已经取了n个物品的状态里取最小值
}
}
}
printf("%d\n",ans);
return ;
}
化工厂装箱员 洛谷 p2530的更多相关文章
- 洛谷 P2530 [SHOI2001]化工厂装箱员 解题报告
P2530 [SHOI2001]化工厂装箱员 题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B ...
- 【题解】SHOI2001化工厂装箱员
————传送:洛谷P2530 这道题目还是挺简单的,状态也容易想到. 数据范围非常的小,所以即便是很多维度,复杂度也完全可以接受.定义状态:dp[i][a][b][c]为手上的货物拿到第i个时三种物品 ...
- 化工厂装箱员(洛谷 P2530)
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- 洛谷P2530 [SHOI2001]化工厂装箱员
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不 ...
- 洛谷 p2530 化工场装箱员(资源型)
化工场装箱员 https://www.luogu.org/problem/show?pid=2530 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的 ...
- [SHOI2001]化工厂装箱员
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- [SHOI2001]化工厂装箱员(dp?暴力:暴力)
118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度 ...
- Luogu 2530 化工厂装箱员
Written with StackEdit. Description \(118\)号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有\(3\ ...
- [ SHOI 2001 ] 化工厂装箱员
\(\\\) \(Description\) 传送带上按顺序传过来\(N\)个物品,一个有\(A,B,C\)三类. 每次装箱员手里只能至多拿十个,然后将手中三类物品中的一类装箱,才能接着拿或接着装箱, ...
随机推荐
- PouchDB 基础
GUIDES http://pouchdb.com/guides/ 1.建立couchDB环境 下载并安装CouchDB: https://couchdb.apache.org/#download 测 ...
- XML 新手入门基础知识
XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.您可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识 ...
- 底层码农的Stanford梦 --- 从SCPD开始 [转]
转载自知乎: https://zhuanlan.zhihu.com/p/25010074 一开始让我写这篇文章的时候,我是拒绝的.毕竟,我不是Stanford毕业的,出来写文章介绍Stanford,难 ...
- encodeURI与decodeURI
Global对象的ecodeURI方法可以对URI进行编码,与其类似的还有一个方法encodeURIComponent方法. 相应的对URI的解码方法也有两个:decodeURI.decodeURIC ...
- javascript的一个简易利率计算器+js图像显示 代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- DotNetCore跨平台~文章索引~永久更新
本索引目录主要包括仓储大叔对dotnet core架构的研究与知识积累,从2016年开始进行撰写,到今天已经有一年多了,其中有一些小知识,小技巧,小应用,希望给大家在开发时一些启发,也希望dotnet ...
- Centos 6.5 安装python3.6
废话不多说,直接上步骤 wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2rc1.tgz 进入 https://www.python.o ...
- SpringWeb增删改查
模型类: package com; public class Model { private int id; private String name; private String dtype; pr ...
- 51nod_1265:四点共面(计算几何)
题目链接 设四点为a_0~3,若共面则 (a1a0*a2a0)·a3a0=0 #include<iostream> #include<cstdio> #include<c ...
- 第2章 rsync(一):基本命令和用法
本文目录: 2.1 说在前面的话 2.2 rsync同步基本说明 2.3 rsync三种工作方式 2.4 选项说明和示例 2.4.1 基础示例 2.4.2 "--exclude"排 ...