牛客练习赛7 B 【排序和优先队列】
2018-02-22 10:28
190 查看
链接:https://www.nowcoder.com/acm/contest/38/B
来源:牛客网
题目描述
在遥远的东方,有一家糖果专卖店。
这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元。
现在的你想要在接下来的n天去糖果店进行选购,你每天可以买多个糖果,也可以选择不买糖果,但是最多买m个。(因为最多只生产m个)买来糖果以后,你可以选择吃掉糖果或者留着之后再吃。糖果不会过期,你需要保证这n天中每天你都能吃到至少一个糖果。
这家店的老板看你经常去光顾这家店,感到非常生气。(因为他不能好好睡觉了)于是他会额外的要求你支付点钱。具体来说,你在某一天购买了 k 个糖果,那么你在这一天需要额外支付 k2 的费用。
那么问题来了,你最少需要多少钱才能达成自己的目的呢?
输入描述:
第一行两个正整数n和m,分别表示天数以及糖果店每天生产的糖果数量。
接下来n行(第2行到第n+1行),每行m个正整数,第x+1行的第y个正整数表示第x天的第y个糖果的费用。
输出描述:
输出只有一个正整数,表示你需要支付的最小费用。
示例1
输入
3 2
1 1
100 100
10000 10000
输出
107
示例2
输入
5 5
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
输出
10
备注:
对于100%的数据,1 ≤ n, m ≤ 300 , 所有输入的数均 ≤ 106。
来源:牛客网
题目描述
在遥远的东方,有一家糖果专卖店。
这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元。
现在的你想要在接下来的n天去糖果店进行选购,你每天可以买多个糖果,也可以选择不买糖果,但是最多买m个。(因为最多只生产m个)买来糖果以后,你可以选择吃掉糖果或者留着之后再吃。糖果不会过期,你需要保证这n天中每天你都能吃到至少一个糖果。
这家店的老板看你经常去光顾这家店,感到非常生气。(因为他不能好好睡觉了)于是他会额外的要求你支付点钱。具体来说,你在某一天购买了 k 个糖果,那么你在这一天需要额外支付 k2 的费用。
那么问题来了,你最少需要多少钱才能达成自己的目的呢?
输入描述:
第一行两个正整数n和m,分别表示天数以及糖果店每天生产的糖果数量。
接下来n行(第2行到第n+1行),每行m个正整数,第x+1行的第y个正整数表示第x天的第y个糖果的费用。
输出描述:
输出只有一个正整数,表示你需要支付的最小费用。
示例1
输入
3 2
1 1
100 100
10000 10000
输出
107
示例2
输入
5 5
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
输出
10
备注:
对于100%的数据,1 ≤ n, m ≤ 300 , 所有输入的数均 ≤ 106。
/*每天要加上k^2的额外费用, 所以我们先处理一下这个,把每地方处理一下, 就是每天价格排序,从小到大,每个糖果价格一次加上1,3,5..., 因为k^2为首项1,差为2的等差数列前n项和*/ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; int cost[305][305]; int main() { priority_queue<int,vector<int>,greater<int> >q;//注意最后两个尖号之间的空格 int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) scanf("%d",&cost[i][j]); } //对每一天的生产的m个糖果进行排序 for(int i=1;i<=n;i++) sort(cost[i]+1,cost[i]+1+m); //排序后将额外支付的k^2直接加到每个糖果上 因为已经排好序 所以每天的糖果将依次加上1,2,3... //将每一天的生产的按排序后的顺序放入优先队列 for(int i=1;i<=n;i++) { int add = 1; for(int j=1;j<=m;j++) { cost[i][j]+=add; add+=2; } } int ans = 0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { q.push(cost[i][j]); } //这两句话在第一层循环内 而不是在两层循环之外的原因:每当把一天生产的糖果按序放入队列后,就要来选择队列中糖果的最小的花费(买的要么是之前的,要么是刚放入的这天的糖果) //所以保证了每天都至少有一个糖果可以吃 因为每天的糖果要么是从当天的糖果中选择的 要么是之前的天生产的糖果中选的 //如果放在了两层循环的最外面,则是将所有生产的糖果按序放入队列,选择最前m个糖果,但是不能保证每天都能有糖果可以吃 ans += q.top(); q.pop(); } cout<<ans<<endl; return 0; }
相关文章推荐
- 牛客网NowCoder 牛客练习赛7-A.骰子的游戏 B.购物-优先队列
- c++中优先队列的使用(自定义排序函数)
- 用STL优先队列对字符串排序
- Javascript数据结构算法之队列(舞伴分配,基数排序,模拟优先就诊病人)
- PTA 7-7(排序) Windows消息队列(25 分) 25分代码 优先队列
- 一步步地分析排序——堆排序与优先队列
- sicily 1022---可用于大数据排序查找中位数(非常快)--优先队列
- 南阳oj 757 期末考试【优先队列+sort排序】
- hdu diy Developing School's Contest 2012-6 by SYU 优先队列排序问题
- 排序笔记_7(基于堆得优先队列)
- Dijkstra单源最短路径算法; 优先队列+静态数组邻接表; STL优先队列还是没想明白排序原则;
- 【纯代码向】 运用优先队列对拓补排序的实现
- 优先队列----解决排序问题
- 【蓝桥杯-优先队列排序】n个最小和
- NOIP提高组2004 合并果子(优先队列排序)
- 优先队列的排序写法
- 优先队列排序:先偶后奇
- LeetCode 451. Sort Characters By Frequency ***** map按值排序转vector,优先队列,频率当下标
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 优先队列结构体重载的二级排序