loj10009钓鱼___vector的调试
题目描述
在一条水平路边,有 n 个钓鱼湖,从左到右编号为1,2,...,n 。佳佳有 h 个小时的空余时间,他希望利用这个时间钓到更多的鱼。他从1 出发,向右走,有选择的在一些湖边停留一定的时间(是 5 分钟的倍数)钓鱼。最后在某一个湖边结束钓鱼。佳佳从第 i 个湖到第 i+1 个湖需要走 5*t_i 分钟路,还测出在第 i 个湖停留,第一个 5 分钟可以钓到 f_i 条鱼,以后每再钓 5 分钟,可以钓到的鱼量减少 d_i,若减少后的鱼量小于 0,则减少后的鱼量为 0 。为了简化问题,佳佳假定没有其他人钓鱼,也没有其他因素影响他钓到期望数量的鱼。请编程求出佳佳最多能钓鱼的数量。
输入格式
第一行一个整数n ,表示湖的个数
第二行一个整数 h,表示佳佳的空闲时间
第三行有 n 个整数,依次表示每个湖第一个 5 分钟能钓到鱼的数量
第四行有 n 个整数,依次表示以后的每5分钟钓鱼数量比前一个 5 分钟钓鱼数量减少的数量
第五行有 n-1 个整数,t_i 表示由第 i 个湖到第 i+1 个湖需要花 5*t_i 分钟的路程
输出格式
输出只有一行,表示佳佳最多能钓鱼的数量。
样例
样例输入
3
1
4 5 6
1 2 1
1 2
样例输出
35
数据范围与提示
对于 100% 的数据2<=n<=100,1<=h<=20。
____________________________________________________
一本通上有这个练习题,很经典。可以用贪心加上堆来做,也可以用动态规划来做。
这个题木主要练习了一下vector的调试输出。
比较新的gdb是可以直接用print来进行输出的
p myvector
如果是比较老的gdb当然也可以用其他方法输出,但是我觉得还是编写一个函数,在用print或者call来调用比较好。
代码如下:
void p(vector<node>&q) { for(int i=0;i<q.size();++i)cout<<'{'<<q[i].v<<' '<<q[i].d<<"},"; cout<<endl; }
调用的格式为
p p(myvector)
或者
call p(myvector)
____________________________________________________
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 105; 4 int n, h; 5 struct node { 6 int v, d; 7 bool operator<(const node &x) const { return v < x.v; } 8 }; 9 vector<node>q; 10 node sz[maxn]; 11 int dis[maxn]; 12 int ans; 13 //void p(vector<node>&q); 14 15 int main() { 16 scanf("%d%d", &n, &h); 17 h *= 12; 18 for (int i = 1; i <= n; ++i) scanf("%d", &sz[i].v); 19 for (int i = 1; i <= n; ++i) scanf("%d", &sz[i].d); 20 for(int x,i=2;i<= n;++i) 21 { 22 scanf("%d",&x); 23 dis[i]=dis[i-1]+x; 24 } 25 for(int i=1;i<=n;++i)//枚举最远的鱼塘 26 { 27 int hh=h-dis[i];//剩余的时间 28 int tans=0; 29 while(!q.empty())q.pop_back(); 30 for(int j=1;j<=i;++j) 31 { 32 q.push_back(sz[j]); 33 push_heap(q.begin(),q.end()); 34 } 35 for(int j=1;j<=hh;++j) 36 { 37 node tp=q[0]; 38 pop_heap(q.begin(),q.end()); 39 q.pop_back(); 40 if(tp.v>0) 41 { 42 tans+=tp.v; 43 tp.v-=tp.d; 44 q.push_back(tp); 45 push_heap(q.begin(),q.end()); 46 } 47 else break; 48 } 49 ans=max(ans,tans); 50 } 51 cout<<ans; 52 53 return 0; 54 } 55 /* 56 void p(vector<node>&q) 57 { 58 for(int i=0;i<q.size();++i)cout<<'{'<<q[i].v<<' '<<q[i].d<<"},"; 59 cout<<endl; 60 } 61 */