[SHOI2001]化工厂装箱员(dp?暴力:暴力)
118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱员grant第1次顺序从流水线上取10个成品(如果一共不足10个,则全部取出),以后每一次把手中某种纯度的成品放进相应的箱子,然后再从流水线上顺序取一些成品,使手中保持10个成品(如果把剩下的全部取出不足10个,则全部取出),如果所有的成品都装进了箱子,那么grant的任务就完成了。
由于装箱是件非常累的事情,grant希望他能够以最少的装箱次数来完成他的任务,现在他请你编个程序帮助他。
Solution
写的像个dp似的,感觉其实就是个暴力(考场这么写肯定是打暴力
设dp[i][j][k][l]表示拿到了i个,A有j个,B有j个,C有k个。
大力转移。
注意特判n<10的情况。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[][][][],sum[][],a[],n;
inline void mi(int &a,int b){if(b<a)a=b;}
char s[];
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%s",s);
a[i]=s[]-'A';
sum[a[i]][i]=sum[a[i]][i-]+;
for(int j=;j<=;++j)if(j!=a[i])sum[j][i]=sum[j][i-];
}
memset(dp,0x3f,sizeof(dp));
if(n<){
cout<<(sum[][n]!=)+(sum[][n]!=)+(sum[][n]!=)<<endl;
return ;
}
dp[][sum[][]][sum[][]][sum[][]]=;
for(int i=;i<=n;++i)
for(int j=;j<=;++j)
for(int k=;k<=&&k+j<=;++k)
for(int l=;l<=&&k+j+l<=;++l)if(dp[i][j][k][l]!=0x3f3f3f3f){
if(j){
int num=j;
mi(dp[min(i+num,n)][sum[][min(n,i+num)]-sum[][i]][k+sum[][min(i+num,n)]-sum[][i]][l+sum[][min(i+num,n)]-sum[][i]],dp[i][j][k][l]+);
}
if(k){
int num=k;
mi(dp[min(i+num,n)][j+sum[][min(n,i+num)]-sum[][i]][sum[][min(n,i+num)]-sum[][i]][l+sum[][min(n,i+num)]-sum[][i]],dp[i][j][k][l]+);
}
if(l){
int num=l;
mi(dp[min(i+num,n)][j+sum[][min(i+num,n)]-sum[][i]][k+sum[][min(i+num,n)]-sum[][i]][sum[][min(i+num,n)]-sum[][i]],dp[i][j][k][l]+);
}
}
int ans=0x3f3f3f3f;
for(int i=;i<=;++i)
for(int j=;i+j<=;++j)
for(int k=;i+j+k<=;++k)if(dp[n][i][j][k]!=0x3f3f3f3f)
ans=min(ans,dp[n][i][j][k]+(i!=)+(j!=)+(k!=));
cout<<ans;;
return ;
}
[SHOI2001]化工厂装箱员(dp?暴力:暴力)的更多相关文章
- 洛谷 P2530 [SHOI2001]化工厂装箱员 解题报告
P2530 [SHOI2001]化工厂装箱员 题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B ...
- 洛谷P2530 [SHOI2001]化工厂装箱员
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不 ...
- [SHOI2001]化工厂装箱员
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- 【题解】SHOI2001化工厂装箱员
————传送:洛谷P2530 这道题目还是挺简单的,状态也容易想到. 数据范围非常的小,所以即便是很多维度,复杂度也完全可以接受.定义状态:dp[i][a][b][c]为手上的货物拿到第i个时三种物品 ...
- 解题:SHOI2001 化工厂装箱员
题面 题外话:从零开始的DP学习系列之壹(我真的不是在装弱,我DP真的就这么烂TAT) 从lyd那里学到了一点DP的小技巧,在设状态时可以先假装自己在做搜索,往一个函数里传了一些参数,然后把这些参数抓 ...
- SHOI2001化工厂装箱员——记忆化搜索
题目:https://www.luogu.org/problemnew/show/P2530 太弱了不会用DP,于是暴搜: 每次传进一个数组c记录当前状态各种物品有多少个,枚举取哪种物品,返回最小值, ...
- [ SHOI 2001 ] 化工厂装箱员
\(\\\) \(Description\) 传送带上按顺序传过来\(N\)个物品,一个有\(A,B,C\)三类. 每次装箱员手里只能至多拿十个,然后将手中三类物品中的一类装箱,才能接着拿或接着装箱, ...
- 化工厂装箱员(洛谷 P2530)
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- 化工厂装箱员 洛谷 p2530
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
随机推荐
- Non-Volatile Register 非易失性寄存器 调用约定对应寄存器使用
非易失性寄存器(Non-volatile register)是它的内容必须通过子程序调用被保存的一个寄存器.如果一个程序改变了一个非易失性寄存器的值,它必须保存在改变这个寄存器之前堆栈中保存旧的值和在 ...
- Java Integer 与 int 深刻理解
今天在做Object 自动转为Integer 类型之后的判断,遇到一个不理解的点,当数值超过127之后,两个数值相同的Object 对象用 == 判断的结果是false. Object a = 128 ...
- 为什么说Java中只有值传递(转载)
出处:https://www.hollischuang.com/archives/2275 关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同, ...
- 爱上linux 简单实现移动办公处理环境.
1. 这周一直在鼓捣linux上面的环境测试. 简单的将 我们的产品部署到了linux上面 详情见前面的 blog 2. 有时候下班了 或者是 在WC (科技园wc排队 说多了都是泪) 或者是眼睛不舒 ...
- day 7-4 互斥锁与队列
一. 基本定义 互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制.该目的通过将代码切片成一个 ...
- 腾讯机试题 AcWing 603 打怪兽
题目链接:https://www.acwing.com/problem/content/605/ 题目大意: 略 分析: 用dp[i][j]表示用j元钱能在前i只怪兽上所能贿赂到的最大武力值. 有一种 ...
- Json dump
json 模块提供了一种很简单的方式来编码和解码JSON数据. 其中两个主要的函数是 json.dumps() 和 json.loads() , 要比其他序列化函数库如pickle的接口少得多. 下面 ...
- 如何在集合中巧用Where来查找相关元素
在我们的项目中我们经常会查找一些集合中的重要元素,当然我们可以使用常规的foreach循环和if语句来查询,但是我们要学会使用System.Linq命名空间下面的静态类Enumerable下面的静态方 ...
- for 循环增强
package cn.zhou.com; /* * 增强for循环 * * for(int i:arr) * { * System.out.print(i+1+" "); * } ...
- layui loading
layer.msg('加载中', { icon: 16 ,shade: 0.4}); layer.load(2);风格二 setTimeout(function(){ layer.closeAll(' ...