财务报表
时间限制(普通/Java) : 2000 MS/ 6000 MS 运行内存限制 : 65536 KByte
总提交 : 305 测试通过 : 90 描述
最近ACM银行总裁CH依次拿到了一些个财务报表,反贪局的SZH需要知道当前已知报表的最大值。 输入
第一行为一个整数M (M<=1000000) 接下来的M行,每行开头是一个字母ch 当ch为‘Q’时,表示询问当前已知报表的最大值,并且需要把最大的报表删除。 当ch为‘I’时,后面有一个整数val,表示增加一个盈利为val的报表 输出
对于每个询问,请输出当前的最大值,若当前没有任何报表存在,则输出No solution 样例输入 5 样例输出 4 题目来源 YB |
题目地址: http://218.194.91.48/acmhome/problemdetail.do?&method=showdetail&id=1150
堆的初学题目,就不解释了。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int s[1001000],cnt=0,m;
void add(int v){
while(v>1){
if(s[v]<=s[v>>1]) break;
swap(s[v],s[v>>1]);
v>>=1;
}
}
void update(int v){
int l;
while(v<=cnt){
l=v<<1;
if(l>cnt) break;
if(l+1<=cnt && s[l|1]>s[l]) l|=1;
if(s[l]<=s[v]) break;
swap(s[l],s[v]);
v=l;
}
}
int main(){
char ch[2];
scanf("%d",&m);
while(m--){
scanf("%s",ch);
if(ch[0]=='Q'){
if(cnt){
printf("%d\n",s[1]);
s[1]=s[cnt--];
update(1);
}
else puts("No solution");
}
else{
scanf("%d",&s[++cnt]);
add(cnt);
}
}
return 0;
}
其实优先队列就可以做了~~ 貌似优先队列就是个堆。。。 堆是手写的优先队列。。
不过跑出来的时间是几乎堆的2倍。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int main(){
char ch[2];
int m,s;
priority_queue<int>que;
scanf("%d",&m);
while(m--){
scanf("%s",ch);
if(ch[0]=='Q'){
if(!que.empty()){
printf("%d\n",que.top());
que.pop();
}
else puts("No solution");
}
else{
scanf("%d",&s);
que.push(s);
}
}
return 0;
}