题目链接:

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. 返回json格式时间,解析时间

    传入:Json格式的时间 JS如下: yyyy-M(MM)-d(dd) H(HH):m(mm):s(ss) function timeStamp2String(time) { var data=tim ...

  2. 线程间通信--wait和notify

    使用wait.notify方法实现线程间的通信(注意这两个方法都是object的类的方法,换句话说java为所有的对象都提供了这两个方法) 1.wait和notify必须配合synchronized关 ...

  3. HTTP协议的URI及各种方法

    每个Web服务器资源都有一个名字,这样客户端就可以说明他们感兴趣的资源是什么了,服务器资 源名被统称为:统一资源标识符(Uniform Resource Identifier, URI) Joe的五金 ...

  4. linux BASH shell设置字体与背景颜色

    linux BASH shell下设置字体及背景颜色的方法. BASH shell下设置字体及背景颜色  echo -e "\e[31mtest\e[41m"  \e[30m 将字 ...

  5. SLF4J日志门面

    SLF4J官网:http://www.slf4j.org/ SLF4J的作用通俗点讲,就是可以让我们的项目以最小的代价更换不同的日志系统.无需修改代码,只需要添加.删除相应的jar包和配置文件. 1. ...

  6. 1)C++对象大小计算

          C++对象的大小不同的编译器的实现是不一样的,以下仅讨论.net2003,其他编译的可能出现的结果以下也做了分析和猜测.在反推不同编译器实现的C++对象的大小时.对齐是一个很重要也容易被遗 ...

  7. Ubuntu安装wps for linux

    1.WPS For Linux 2013 还是只提供了32位版本,我用的是 64位 Ubuntu,如果您也是64位系统,还需要提前安装一些32位的库文件. sudo apt-get install i ...

  8. 自学Python三 Python中的屠龙刀(续)

    装饰器: 在函数代码功能运行期间动态增加功能的方式叫做装饰器(Decorator).它对一个函数或者类进行再加工. 我们先定义两个函数,一个计算两数和,一个计算两数差. >>> de ...

  9. 深度理解依赖注入(Dependence Injection)

    前面的话:提到依赖注入,大家都会想到老马那篇经典的文章.其实,本文就是相当于对那篇文章的解读.所以,如果您对原文已经有了非常深刻的理解,完全不需要再看此文:但是,如果您和笔者一样,以前曾经看过,似乎看 ...

  10. Weka链接Mysql数据库

    Weka简介 Weka的全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis),是一款免费的,非商业化(与之对应的是SPSS公司商业数据挖掘产 ...