UVALive - 6952 Cent Savings dp
题目链接:
http://acm.hust.edu.cn/vjudge/problem/116998
Cent Savings
Time Limit: 3000MS
#### 问题描述
> To host a regional contest like NWERC a lot of
> preparation is necessary: organizing rooms and
> computers, making a good problem set, inviting
> contestants, designing T-shirts, booking hotel
> rooms and so on. I am responsible for going
> shopping in the supermarket.
> When I get to the cash register, I put all my
> n items on the conveyor belt and wait until all
> the other customers in the queue in front of me
> are served. While waiting, I realize that this
> supermarket recently started to round the total
> price of a purchase to the nearest multiple of 10
> cents (with 5 cents being rounded upwards). For
> example, 94 cents are rounded to 90 cents, while
> 95 are rounded to 100.
> It is possible to divide my purchase into groups and to pay for the parts separately. I managed to
> find d dividers to divide my purchase in up to d + 1 groups. I wonder where to place the dividers to
> minimize the total cost of my purchase. As I am running out of time, I do not want to rearrange items
> on the belt.
#### 输入
> The input file contains several test cases, each of them as described below.
> The input consists of:
> • one line with two integers n (1 ≤ n ≤ 2000) and d (1 ≤ d ≤ 20), the number of items and the
> number of available dividers;
> • one line with n integers p1, . . . , pn (1 ≤ pi ≤ 10000 for 1 ≤ i ≤ n), the prices of the items in
> cents. The prices are given in the same order as the items appear on the belt.
#### 输出
> For each test case, output the minimum amount of money needed to buy all the items, using up to d
> dividers.
样例
sample input
5 1
13 21 55 60 42
5 2
1 1 1 1 1sample output
190
0
题意
给你一个数组,现在要把它最多切d刀分成d+1块,对每一块的和要四舍五入,问如果分割使得最后的和最大。
题解
各种姿势的dp:
dp[i][j][k]表示前i个,切了j刀,最后一刀切完之后的值%10为k的舍入的最大偏差。
则最后的结果=min(sum-dp[n][j][k])。
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const int maxn=2222;
int n,d;
int arr[maxn];
int dp[maxn][22][11];
inline int f(int x){
if(x<5) return x;
else return x-10;
}
int main() {
while(scanf("%d%d",&n,&d)==2){
rep(i,0,maxn) rep(j,0,22) rep(k,0,11) dp[i][j][k]=-INF;
dp[0][0][0]=0;
int sum=0;
rep(i,1,n+1){
scanf("%d",&arr[i]);
sum+=arr[i];
}
rep(i,0,n){
rep(j,0,d+1){
rep(k,0,10){
int nk=(arr[i+1]+k)%10;
dp[i+1][j][nk]=max(dp[i+1][j][nk],dp[i][j][k]-f(k)+f(nk));
nk=arr[i+1]%10;
if(j+1<=d) dp[i+1][j+1][nk]=max(dp[i+1][j+1][nk],dp[i][j][k]+f(nk));
}
}
}
int ma=f(sum%10);
rep(j,0,d+10){
rep(k,0,10){
ma=max(ma,dp[n][j][k]);
}
}
printf("%d\n",sum-ma);
}
return 0;
}
dp[i][j]表示前i个切了j刀得到的最小和(刀切在i后面或不切)。
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define pb(v) push_back(v)
#define sz() size()
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
//start----------------------------------------------------------------------
const int maxn=2222;
const int maxm=22;
int n,d;
int dp[maxn][maxm];
int arr[maxn];
int f(int x){
int t=x%10;
if(t>=5) x+=10;
x-=t;
return x;
}
int main() {
while(scanf("%d%d",&n,&d)==2){
clr(dp,0x3f);
dp[0][0]=0;
rep(i,1,n+1) scanf("%d",&arr[i]);
rep(i,1,n){
rep(j,0,d+1){
if(j==0) dp[i][j]=dp[i-1][j]+arr[i];
else dp[i][j]=min(dp[i-1][j]+arr[i],f(dp[i-1][j-1]+arr[i]));
}
}
int ans=INF;
rep(j,0,d+1) ans=min(ans,f(dp[n-1][j]+arr[n]));
printf("%d\n",ans);
}
return 0;
}
//end-----------------------------------------------------------------------
dp[i][j]表示前i个切了j刀得到的最小和
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define pb(v) push_back(v)
#define sz() size()
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const int maxn=2222;
const int maxm=22;
int n,d;
int dp[maxn][maxm];
int arr[maxn],sumv[maxn];
int f(int x){
int t=x%10;
if(t>=5) x+=10;
x-=t;
return x;
}
int main() {
while(scanf("%d%d",&n,&d)==2){
clr(dp,0x3f);
dp[0][0]=0; sumv[0]=0;
rep(i,1,n+1){
scanf("%d",&arr[i]);
sumv[i]=sumv[i-1]+arr[i];
dp[i][0]=f(sumv[i]);
}
rep(i,1,n+1){
rep(j,1,d+1){
rep(k,0,i){
dp[i][j]=min(dp[i][j],dp[k][j-1]+f(sumv[i]-sumv[k]));
}
}
}
int ans=f(sumv[n]);
rep(j,1,d+1) ans=min(ans,dp[n][j]);
printf("%d\n",ans);
}
return 0;
}
UVALive - 6952 Cent Savings dp的更多相关文章
- uva 6952 Cent Savings dp
Cent Savings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/vie ...
- UVALive - 6952 DP 分段/隔板
题意:商品总价按四舍五入计算,n个物品最多可分\(d+1\)段,求最小代价 \(dp[i][j]\):\(j\)个物品分\(i\)段 注意一个技巧是只在需要分出新的段时才四舍五入(旧段结算),这样就避 ...
- UVALive - 6529 找规律+dp
题目链接: http://acm.hust.edu.cn/vjudge/problem/47664 Eleven Time Limit: 5000MS 问题描述 In this problem, we ...
- UVaLive 6801 Sequence (计数DP)
题意:给定一个序列,有 n 个数,只有01,然后你进行k次操作,把所有的1变成0,求有多种方法. 析:DP是很明显的,dp[i][j] 表示进行第 i 次操作,剩下 j 个1,然后操作就两种,把1变成 ...
- UVaLive 6697 Homework Evaluation (DP)
题意:给出一个长字符串,再给一个短字符串,进行匹配,如果第i个恰好匹配,则 +8,:如果不匹配,可以给长或短字符串添加-,先后匹配,这样-3, 连续的长字符串添加-,需要减去一个4:也可不给添加-,则 ...
- UVaLive 7374 Racing Gems (DP,LIS)
题意:以辆赛车可以从x轴上任意点出发,他的水平速度允许他向每向上移动v个单位,就能向左或向右移动v/r个单位(也就是它的辐射范围是个等腰三角形) 现在赛车从x轴出发,问它在到达终点前能吃到的最多钻石. ...
- UVALive 6947 Improvements(DP+树状数组)
[题目链接] https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=sho ...
- UVaLive 3490 Generator (KMP + DP + Gauss)
题意:随机字母组成一个串,有一个目标串,当这个由随机字母组成的串出现目标串就停止,求这个随机字母组成串的期望长度. 析:由于只要包含目标串就可以停止,所以可以先把这个串进行处理,也就是KMP,然后dp ...
- UVALive 6908 Electric Bike dp
Electric Bike 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8 ...
随机推荐
- 使用C#中JavaScriptSerializer类将对象转换为Json格式数据
将对象转换为json格式字符串: private JavaScriptSerializer serializer = new JavaScriptSerializer(); protected voi ...
- 关于SQL表联接
以SQL2008为例,Microsoft SQL Server 2008支持四种表运算符-JOIN,APPLY,PIVOT,UNPIVOT.JOIN表运算符是ANSI标准,而其他三种是T-SQL对标准 ...
- CentOS配置FTP(VSFTPD)
一.vsftp安装篇 # 安装vsftpd yum -y install vsftpd # 启动 service vsftpd start # 开启启动 chkconfig vsftpd on 二.v ...
- spring 知识梳理
https://github.com/spring-projects/spring-framework spring github地址
- apache日志文件详解和实用分析命令
apache日志文件每条数据的请意义,以及一些实用日志分析命令. 一.日志分析 如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error ...
- PHP file_get_contents于curl性能效率比较
说明大部分内容整理来源于网络,期待你的补充.及不当之处的纠正: 1)fopen/file_get_contents 每次请求远程URL中的数据都会重新做DNS查询,并不对DNS信息进行缓存.但是CUR ...
- Spark官方文档——本地编写并运行scala程序
快速开始 本文将介绍如何用scala.java.python编写一个spark单击模式的程序. 首先你只需要在一台机器上成功建造Spark:做法: 进入Spark的根目录,输入命令:$ sbt/sbt ...
- [读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例
这是我的文章备份,原始出处:[读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例 http://www.dotblogs.com.tw/mis2000lab/archive/ ...
- [terry笔记]更改oracle用户名
更改oracle的用户名 之前有个需求,整理一个schema的表.索引等规划到一个表空间里,利用expdp/impdp然后remap就完成了,但是整理好的用户名remap变更了,应用又不想修改其连接信 ...
- 插值和空间分析(二)_变异函数分析(R语言)
方法1.散点图 hscat(log(zinc)~, meuse, (:)*) 方法2.变异函数云图 library(gstat) cld <- variogram(log(zinc) ~ , m ...