题目链接:

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 1

sample 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的更多相关文章

  1. uva 6952 Cent Savings dp

    Cent Savings Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/vie ...

  2. UVALive - 6952 DP 分段/隔板

    题意:商品总价按四舍五入计算,n个物品最多可分\(d+1\)段,求最小代价 \(dp[i][j]\):\(j\)个物品分\(i\)段 注意一个技巧是只在需要分出新的段时才四舍五入(旧段结算),这样就避 ...

  3. UVALive - 6529 找规律+dp

    题目链接: http://acm.hust.edu.cn/vjudge/problem/47664 Eleven Time Limit: 5000MS 问题描述 In this problem, we ...

  4. UVaLive 6801 Sequence (计数DP)

    题意:给定一个序列,有 n 个数,只有01,然后你进行k次操作,把所有的1变成0,求有多种方法. 析:DP是很明显的,dp[i][j] 表示进行第 i 次操作,剩下 j 个1,然后操作就两种,把1变成 ...

  5. UVaLive 6697 Homework Evaluation (DP)

    题意:给出一个长字符串,再给一个短字符串,进行匹配,如果第i个恰好匹配,则 +8,:如果不匹配,可以给长或短字符串添加-,先后匹配,这样-3, 连续的长字符串添加-,需要减去一个4:也可不给添加-,则 ...

  6. UVaLive 7374 Racing Gems (DP,LIS)

    题意:以辆赛车可以从x轴上任意点出发,他的水平速度允许他向每向上移动v个单位,就能向左或向右移动v/r个单位(也就是它的辐射范围是个等腰三角形) 现在赛车从x轴出发,问它在到达终点前能吃到的最多钻石. ...

  7. UVALive 6947 Improvements(DP+树状数组)

    [题目链接] https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=sho ...

  8. UVaLive 3490 Generator (KMP + DP + Gauss)

    题意:随机字母组成一个串,有一个目标串,当这个由随机字母组成的串出现目标串就停止,求这个随机字母组成串的期望长度. 析:由于只要包含目标串就可以停止,所以可以先把这个串进行处理,也就是KMP,然后dp ...

  9. UVALive 6908 Electric Bike dp

    Electric Bike 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8 ...

随机推荐

  1. SqlServer将表中数据复制到另一张表

    insert into phone2(ph,attr,type,carrier) select top 1000 ph,attr,type,carrier from phone 将表phone的字段和 ...

  2. C#中的快捷键,可以更方便的编写代码 (转载)

    C#中的快捷键,可以更方便的编写代码 CTRL + SHIFT + B 生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O 打开项目 CTRL + ...

  3. 整理一些有意思的php笔试题

    慢慢补充 1.下面这段代码的输出是什么: $a = in_array('01', array('1'))==var_dump('01'==1); echo $a; 说明:in_array('01', ...

  4. luigi学习-luigi的配置文件

    一.luigi配置文件的加载顺序 /etc/luigi/client.cfg luigi.cfg LUIGI_CONFIG_PATH环境变量 二.配置文件分节 配置文件被分为了多个section,每一 ...

  5. js各种宽高(1)

    在javascript中操作dom节点让其运动的时候,常常会涉及到各种宽高以及位置坐标等概念,如果不能很好地理解这些属性所代表的意义,就不能理解js的运动原理,同时,由于这些属性概念较多,加上浏览器之 ...

  6. Windows下安装Elasticsearch

    1.下载elasticsearch-1.6.0 .jdk-7u67-windows-x64.exe 1.6.0必须用jdk1.7才能运行 2.配置JAVA_HOME:C:\Program Files\ ...

  7. KMP串匹配算法解析与优化

    朴素串匹配算法说明 串匹配算法最常用的情形是从一篇文档中查找指定文本.需要查找的文本叫做模式串,需要从中查找模式串的串暂且叫做查找串吧. 为了更好理解KMP算法,我们先这样看待一下朴素匹配算法吧.朴素 ...

  8. spring mvc中的文件上传

    使用commons-fileupload上传文件所需要的架包有:commons-fileupload 和common-io两个架包支持,可以到Apache官网下砸. 在配置文件spring-mvc.x ...

  9. html中的框架

    1.总的代码 <frameset rows=20%,*> <frame src="top.html" /> <frameset cols=30%,*& ...

  10. delphi的几个特别关键字 object absolute

    1.object关键字相当于C++中的struct, record定义个结构体只能定义数据,而object可以定义方法,默认都是public的.   代码示例如下: TTest = record na ...