codeforce447 D - DZY Loves Modification 
题意:
有一个n*m的矩阵,每次可以选择一行或者一列,可以得到这行或这列的所有元素sum的积分,
然后使这一列/行的每一个元素都减少p,接着再选择一行或一列,共操作k次,n,m<=1000,k<=1000000
求最多能得到多少积分

思路:
每次选择sum最大的行或者列,但是时间复杂度太大,过不去~
若选择一行,则每个列的sum一定减少p,同理;
若选择的行数和列数确定下来了,选择i行,k-i列,那么行和列之间谁选选择就没有影响;
因为在选择行的时候,每一列都的sum都减少p,每一列的相对大小没有变化,前k-i大的列还是那几列,同列。
所以可以用优先队列O(n)预处理出row_sum[i]和col_sum[k-i]的值。选i行则消耗了每列的i*p的大小,共k-i列,故共消耗了i*(k-i)*p,答案为
max( row_sum[i], col_sum[k-i])- i*(k-i)*p

注意:!!!!!WA了很久T.T,因为i*(k-i)*p会超过int范围!!!

  1. /*===============================================================
  2. * Copyright (C) 2014 All rights reserved.
  3. *
  4. * File Name: codeforces447_D_greedy.cpp
  5. * Author:sunshine
  6. * Created Time: 2014年07月23日
  7. *
  8. ================================================================*/
  9. #include <map>
  10. #include <queue>
  11. #include <stack>
  12. #include <math.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <iostream>
  16. #include <algorithm>
  17.  
  18. using namespace std;
  19.  
  20. int arr[][];
  21. long long row_sum[];
  22. long long col_sum[];
  23.  
  24. int main(){
  25. int n,m,k,p;
  26. cin >> n >> m >> k >> p;
  27.  
  28. priority_queue<int>row,col;
  29.  
  30. for(int i = ;i < n;i ++){
  31. long long tmp = ;
  32. for(int j = ;j < m;j ++){
  33. cin >> arr[i][j];
  34. tmp += arr[i][j];
  35. }
  36. row.push(tmp);
  37. }
  38.  
  39. for(int j = ;j < m;j ++){
  40. long long tmp = ;
  41. for(int i = ;i < n;i ++){
  42. tmp += arr[i][j];
  43. }
  44. col.push(tmp);
  45. }
  46.  
  47. row_sum[] = ;
  48. for(int i = ;i <= k;i ++){
  49. row_sum[i] = row_sum[i - ] + row.top();
  50. row.push(row.top() - m * p);
  51. row.pop();
  52. }
  53.  
  54. col_sum[] = ;
  55. for(int i = ;i <= k;i ++){
  56. col_sum[i] = col_sum[i-] + col.top();
  57. col.push(col.top() - n * p);
  58. col.pop();
  59. }
  60.  
  61. long long res = row_sum[] + col_sum[k];
  62. for(int i = ;i <= k;i ++){
  63. res = max(res, row_sum[i] + col_sum[k - i] - (long long)i * (k - i) * p);
  64. }
  65. cout << res << endl;
  66. return ;
  67. }

SGU 548 Dragons and Princesses
题意:
唐僧从起点1出发,依次从1到2到3……到n,第n位一定是一位公主,在2~n-1中可能是公主,也可能是龙,
d表示龙,p表示公主,每只龙有di个金币,每位公主有pi的美丽值,杀死一只龙就可以得到相应的财富值。
唐僧喜欢位置为n的那位公主,所以要和位置为n的公主结婚,所以他不能被其他公主喜欢上,必须被最后一个公主喜欢。
他被公主喜欢上的条件是:在遇到位置为i的公主是,如果pi小于等于唐僧杀死的龙的数量,那么公主
就认为唐僧很V5,会喜欢上唐僧,问题,唐僧成功和位置为n的公主结婚的情况下,最多能得到多少金币。
如果不能结婚,输出-1。

思路:
利用优先队列遇到龙就吃掉,遇到公主,发现吃多了,就把多余的小的都吐出来,当然遇到最后一个公主的时候不需要吐出来。

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <queue>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. struct node{
  9. int key;
  10. int id;
  11. friend bool operator < (node a,node b){
  12. return a.key > b.key;
  13. }
  14. }dro;
  15.  
  16. int arr[];
  17.  
  18. int main(){
  19. int n;
  20. char ch[];
  21. int key;
  22. int base;
  23. while(scanf("%d", &n) != EOF){
  24.  
  25. priority_queue<node>que;
  26.  
  27. for(int i = ;i < n - ;i ++){
  28. scanf("%s %d", ch, &key);
  29.  
  30. if(ch[] == 'd'){
  31. dro.key = key;
  32. dro.id = i + ;
  33. que.push(dro);
  34. }
  35. if(ch[] == 'p'){
  36. if(i != n - ){
  37. while(que.size() >= key){
  38. que.pop();
  39. }
  40. }else{
  41. base = key;
  42. }
  43. }
  44. }
  45.  
  46. if(que.size() < base){
  47. puts("-1");
  48. }else{
  49. int res = ;
  50. int top = ;
  51. while(que.size()){
  52. dro = que.top();
  53. que.pop();
  54. // printf("key:%d id:%d\n",dro.key,dro.id);
  55. res += dro.key;
  56. arr[top++] = dro.id;
  57. }
  58.  
  59. sort(arr,arr + top);
  60.  
  61. printf("%d\n%d\n",res,top);
  62.  
  63. for(int i = ;i < top - ;i ++){
  64. printf("%d ",arr[i]);
  65. }
  66. printf("%d\n",arr[top - ]);
  67. }
  68. }
  69. return ;
  70. }

codeforce447 D SGU 548 贪心+优先队列的更多相关文章

  1. hihoCoder 1309:任务分配 贪心 优先队列

    #1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN,  ...

  2. UVA 11134 - Fabled Rooks(贪心+优先队列)

    We would like to place  n  rooks, 1 ≤  n  ≤ 5000, on a  n×n  board subject to the following restrict ...

  3. C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列

    C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  4. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  5. 贪心+优先队列 HDOJ 5360 Hiking

    题目传送门 /* 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能 被邀 ...

  6. [POJ1456]Supermarket(贪心 + 优先队列 || 并查集)

    传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 #include <queue> #include <cstdio> #include <i ...

  7. Painting The Fence(贪心+优先队列)

    Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...

  8. CF140C New Year Snowmen(贪心+优先队列)

    CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...

  9. BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 3785  Solved: 1747[Submit][Statu ...

随机推荐

  1. hdu 3342 Legal or Not(拓扑排序) HDOJ Monthly Contest – 2010.03.06

    一道极其水的拓扑排序……但是我还是要把它发出来,原因很简单,连错12次…… 题意也很裸,前面的废话不用看,直接看输入 输入n, m表示从0到n-1共n个人,有m组关系 截下来m组,每组输入a, b表示 ...

  2. C# 类与接口的几个问题的总结(待续)

    1. 有关类的多态性 C#中,类的多态性是通过在子类中重载基类的虚方法(virtual标识)或函数成员来实现. 在C#中,继承.虚方法和重写方法组合在一起才能实现多态性. 2. 显式接口成员的使用 显 ...

  3. Jedis的JedisSentinelPool源代码分析

    概述 Jedis是Redis官方推荐的Java客户端,更多Redis的客户端可以参考Redis官网客户端列表.Redis-Sentinel作为官方推荐的HA解决方案,Jedis也在客户端角度实现了对S ...

  4. CSS基础知识—【结构、层叠、视觉格式化】

    结构和层叠 选择器的优先级顺序: style[内联元素]选择器>Id选择器>类选择器 属性选择器>元素选择器>通配器选择器 重要性:@important 有这个标记的属性值,优 ...

  5. 从python的yield说起

    前段时间在读trac 中wiki模块的源码的时候,发现了很多地方都使用了yiled这一关键词, 感觉是在需要返回某个值的地方通过yield来代替return, 不是很明白其用法,所以仔细研究下. 一个 ...

  6. iOS开发相关图书推荐

    Objective-C编程之道:iOS设计模式解析 作      者 [美] Carlo Chung 著:刘威 译 出 版 社 人民邮电出版社 出版时间 2011-11-01 版      次 1 页 ...

  7. 基于Hbase数据的Mapreduce程序环境开发

    一.实验目标 编写Mapreduce程序,以Hbase表数据为Map输入源,计算结果输出到HDFS或者Hbase表中. 在非CDH5的Hadoop集群环境中,将编写好的Mapreduce程序整个工程打 ...

  8. 基于easyui的验证扩展

    基于easyui的验证扩展 ##前言 自己做项目也有好几年的时间了,一直没有时间整理自己的代码,趁春节比较闲,把自己以前的代码整理了一篇.这是基于easyui1.2.6的一些验证扩展,2012年就开始 ...

  9. hdu4505小Q系列故事——电梯里的爱情

    小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  10. Lucene:信息检索与全文检索

    目录 信息检索的概念 信息检索技术的分类 全文检索与数据库查询对比 全文检索工具一般由三部分构成 全文检索中建立索引和进行检索的流程 索引里面究竟存什么 如何创建索引 如何对索引进行检索 Lucene ...