codeforce447 D SGU 548 贪心+优先队列
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范围!!!
/*===============================================================
* Copyright (C) 2014 All rights reserved.
*
* File Name: codeforces447_D_greedy.cpp
* Author:sunshine
* Created Time: 2014年07月23日
*
================================================================*/
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm> using namespace std; int arr[][];
long long row_sum[];
long long col_sum[]; int main(){
int n,m,k,p;
cin >> n >> m >> k >> p; priority_queue<int>row,col; for(int i = ;i < n;i ++){
long long tmp = ;
for(int j = ;j < m;j ++){
cin >> arr[i][j];
tmp += arr[i][j];
}
row.push(tmp);
} for(int j = ;j < m;j ++){
long long tmp = ;
for(int i = ;i < n;i ++){
tmp += arr[i][j];
}
col.push(tmp);
} row_sum[] = ;
for(int i = ;i <= k;i ++){
row_sum[i] = row_sum[i - ] + row.top();
row.push(row.top() - m * p);
row.pop();
} col_sum[] = ;
for(int i = ;i <= k;i ++){
col_sum[i] = col_sum[i-] + col.top();
col.push(col.top() - n * p);
col.pop();
} long long res = row_sum[] + col_sum[k];
for(int i = ;i <= k;i ++){
res = max(res, row_sum[i] + col_sum[k - i] - (long long)i * (k - i) * p);
}
cout << res << endl;
return ;
}
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。
思路:
利用优先队列遇到龙就吃掉,遇到公主,发现吃多了,就把多余的小的都吐出来,当然遇到最后一个公主的时候不需要吐出来。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <algorithm> using namespace std; struct node{
int key;
int id;
friend bool operator < (node a,node b){
return a.key > b.key;
}
}dro; int arr[]; int main(){
int n;
char ch[];
int key;
int base;
while(scanf("%d", &n) != EOF){ priority_queue<node>que; for(int i = ;i < n - ;i ++){
scanf("%s %d", ch, &key); if(ch[] == 'd'){
dro.key = key;
dro.id = i + ;
que.push(dro);
}
if(ch[] == 'p'){
if(i != n - ){
while(que.size() >= key){
que.pop();
}
}else{
base = key;
}
}
} if(que.size() < base){
puts("-1");
}else{
int res = ;
int top = ;
while(que.size()){
dro = que.top();
que.pop();
// printf("key:%d id:%d\n",dro.key,dro.id);
res += dro.key;
arr[top++] = dro.id;
} sort(arr,arr + top); printf("%d\n%d\n",res,top); for(int i = ;i < top - ;i ++){
printf("%d ",arr[i]);
}
printf("%d\n",arr[top - ]);
}
}
return ;
}
codeforce447 D SGU 548 贪心+优先队列的更多相关文章
- hihoCoder 1309:任务分配 贪心 优先队列
#1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, ...
- UVA 11134 - Fabled Rooks(贪心+优先队列)
We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the following restrict ...
- 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 ...
- HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...
- 贪心+优先队列 HDOJ 5360 Hiking
题目传送门 /* 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能 被邀 ...
- [POJ1456]Supermarket(贪心 + 优先队列 || 并查集)
传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 #include <queue> #include <cstdio> #include <i ...
- Painting The Fence(贪心+优先队列)
Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...
- CF140C New Year Snowmen(贪心+优先队列)
CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...
- BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 3785 Solved: 1747[Submit][Statu ...
随机推荐
- ejabberd、jabber、jabberd、xmpp辨析
Jabber 是著名的即时通讯服务服务器,它是一个自由开源软件,能让用户自己架即时通讯服务器,可以在Internet上应用,也可以在局域网中应用. XMPP(可扩展消息处理现场协议)是基于可扩展 ...
- Windows环境自动获取AWR报告
1.双击awr.cmd,通过cmd窗口运行awr.sql cmd.exe /c sqlplus lcam_1230/zcpzg1z_1230@54_orcl @awr.sql awr.cmd 2.aw ...
- 利用反射自动生成SQL语句(仿Linq)
转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...
- CXF之八 RESTFul服务
JAX-RS概述 JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API.JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开 ...
- Longest Run on a Snowboard
题意: n*m的矩阵,求矩阵中最长下降的序列的长度. 分析: dp[i][j]表示以i,j为起点的最长下降序列,然后记忆化搜索. #include <map> #include <s ...
- <转>DNS服务系列之二:DNS区域传送漏洞的安全案例
DNS区域传送(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库.这为运行中的DNS服务提供了一定的冗余度,其目的是为了防止主的域名服务器因 ...
- 在ASP.NET下做了一个实验MVC的小东西
星期五下班前一时兴起,对MVC发表了一点看法.后来就想干脆弄个小东西来验证一些自己的想法帮组理清思路.所要源代码的免了,3个小时的急就章实在是乱得可以,既没有好的架构,也没有任何代码质量可言,主要是实 ...
- bookhub -- 扁平化本地电子书管理与分享工具
代码 github 地址:https://github.com/JackonYang/bookhub 初稿: 1. 关键功能点 扫描本地电子书(扩展名 pdf/epub 等),将不重复的复制到特 ...
- quick-x在windows平台打包加密文件
D:\quick-cocos2d-x-2.2.1-rc\bin>compile_scripts -i ..\mygames\myth\scripts -o ..\mygames\myth\res ...
- matlab中的字符串数组与函数调用
1, matlab中的字符串就是1维字符数组,即如: a = 'dddssd'; b = 'lsde'; c = [a, b]; 当然也可以: c= strcat(a, b); 2, matlab中的 ...