【集训Day1 测试】选择课题
选择课题(bestproject)
【问题描述】
Robin 要在下个月交给老师 n 篇论文,论文的内容可以从 m 个课题中选择。由于课题数有限,Robin 不得不重复选择一些课题。完成不同课题的论文所花的时间不同。具体地说,对于某个课题 i,若 Robin 计划一共写 x 篇论文,则完成该课题的论文总共需要花费 Ai*x^Bi 个单位时间(系数 Ai 和指数 Bi 均为正整数)。给定与每一个课题相对应的 Ai 和 Bi 的值,请帮助 Robin 计算出如何选择论文的课题使得他可以花费最少的时间完成这 n 篇论文。
【输入格式】
第一行有两个用空格隔开的正整数 n 和 m,分别代表需要完成的论文数和可供选择的课题数。
以下 m 行每行有两个用空格隔开的正整数。其中,第 i 行的两个数分别代表与第 i 个课题相对应的时间系数 Ai 和指数 Bi。
【输出格式】
输出完成 n 篇论文所需要耗费的最少时间。
【输入样例】
10 3
2 1
1 2
2 1
【输出样例】
19
【样例说明】
4 篇论文选择课题一,5 篇论文选择课题三,剩下一篇论文选择课题二,总耗时为 2*4^1+1*1^2+2*5^1=8+1+10=19。可以证明,不存在更优的方案使耗时小于 19。
【数据规模】
对于 40%的数据,n<=10,m<=5;
对于 100%的数据,n<=200,m<=20,Ai<=100,Bi<=5。
【解题思路】
本题属于动态规划中的完全背包问题。·根据动态规划的思想推导状态转移方程,令dp[m][n]表示前m个课题写n篇论文的最优解,以课题为阶段,即为完全背包中以物品为阶段。
然后进行推导,在dp[m][n]之前做了什么,无非就是选择第m个课题写k(0<=k<=n)篇论文。
那么根据这样的推导,状态转移方程就是:dp[m][n]=min(dp[m][n],dp[m-1][n-k]+a[m]*k^b[m]。
数据量不大,完全可以直接dp,无须优化。
【解题反思】
- 对于经典的模板题应该要十分熟悉
- 由于结果可能很大,建议使用long long
- 注意数组的范围
【参考程序】
#include<iostream>
#include<cstdio>
using namespace std;
const long long maxint=1000000000000000;
int n,m,a[21],b[21];
long long f[21][201],ans;
long long power(int x,int y)//求x的y次幂
{
long long sum=1;
for (int i=1;i<=y;i++) sum*=x;
return sum;
}
int main()
{
freopen("bestproject.in","r",stdin);
freopen("bestproject.out","w",stdout);
cin>>n>>m;
for (int i=1;i<=m;i++) cin>>a[i]>>b[i];
for (int i=0;i<=m;i++)
for (int j=1;j<=n;j++) f[i][j]=maxint;
//初始化为无穷大
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
for (int k=0;k<=j;k++)
f[i][j]=min(f[i][j],f[i-1][j-k]+a[i]*power(k,b[i]));//状态转移方程
cout<<f[m][n];
return 0;
}
【集训Day1 测试】选择课题的更多相关文章
- 中山纪中集训Day1测试(摸鱼)
AT3 粉刷匠 Description 赫克托是一个魁梧的粉刷匠,而且非常喜欢思考= = 现在,神庙里有N根排列成一直线的石柱,从1到N标号,长老要求用油漆将这些石柱重新粉刷一遍.赫克托有K桶颜色各不 ...
- 【集训Day1 测试】装饰
装饰(decorate) [题目描述] 一个图有 N 个结点,编号 1 至 N,有 M 条无向边,第 i 条边连接的两个结点是 Ai 和Bi,其中 Ai 和 Bi 是不同的结点.可能有多条边连接的是同 ...
- 【集训Day1 测试】【USACO】照相
照相(fairphoto) [题目描述] 有N 头奶牛站在一条数轴上,第 i 头奶牛的位置是 Pi,奶牛不会重叠站在同一个位置, 第i 头奶牛的颜色是 Ci,其中 Ci 要么是字符'G'要么是字符'H ...
- 【集训Day1 测试】奇怪数
奇怪数(odometer) [题目描述] 一个正整数Z是奇怪数,当且仅当满足的条件是:Z的所有数字中,只有一个数字不同于其他数字.例如:33323.110 都是奇怪数,而 9779.5555 都不是奇 ...
- 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1
目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...
- 国庆集训 Day1 T2 生成图 DP
国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...
- 2019暑期金华集训 Day1 组合计数
自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...
- 2019暑期金华集训 Day1 数据结构
自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...
- LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)
LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set $ solution: $ 这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小.于是我 ...
随机推荐
- AJAX异步检查,检查用户名是否存在
AJAX异步检查,检查用户名是否存在 写法一: var xmlHttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, ...
- 设计模式(十二)Decorator模式
Decorator模式就是不断地为对象添加装饰的设计模式.以蛋糕为例,程序中的对象就相当于蛋糕,然后像不断地装饰蛋糕一样地不断地对其增加功能,它就变成了使用目的更加明确的对象. 首先看示例程序的类图. ...
- IndentationError: unindent does not match any outer indentation level笔记
执行一个Python脚本的时候,报"IndentationError: unindent does not match any outer indentation level" 错 ...
- CSPS模拟 77
%%两位AK爷zkt和skyh T1 位间独立,分别讨论 T2 维护标记,代替移位 T3 同一点对,多种联通,没法搞. 发现最多四路连通,考虑容斥. 显然的奇加偶减. 发现统计某种颜色的点之间的联通数 ...
- CSPS模拟 67
炸分炸的厉害.(当然这跟b哥定律无关 话说好久没人嘲笑我菜了,快飘的不知道到哪了. 谁能讽我两句我不要面子的. 另外在博客上写些没用的东西好浪费精力啊我又不想当网红 主要是考试的时候心态不稳. 以为T ...
- JS- 封装、继承、多态
http://www.cnblogs.com/silence516/articles/1509456.html
- Oracle“ORA-00979:不是GROUP BY 表达式”解决方式
今天在工作中碰到一个问题,用group by 语句进行分组时出现ORA-00979错误. 代码如下: select R.ORDER_NO, R.PRODUCT_CODE, R.REGION_NO, R ...
- 基于 H5 Canvas 实现楼宇自控系统
前言 楼宇自控是指楼宇中电力设备,如电梯.水泵.风机.空调等,其主要工作性质是强电驱动.通常这些设备是开放性的工作状态,也就是说没有形成一个闭环回路.只要接通电源,设备就在工作,至于工作状态.进程.能 ...
- python——函数的基本概念
Python函数认识 数学定义 y = f(x), y是x的函数,x是自变量. python中的函数组成 由若干语句组成的语句块.函数名称.参数列表构成,函数是组织代码的最小单元 像一个黑盒子,我们给 ...
- 一种logging封装方法,不会产生重复log
在调试logging的封装的时候,发现已经调用了logging封装的函数,在被其它函数再调用时,会出现重复的logging.原因是不同的地方创建了不同的handler,所以会重复,可以使用暴力方法解决 ...