csoj练习题目第一天。
新年礼物
签到题,直接模拟过程即可。
#include <bits/stdc++.h> #define MAX 100005 using namespace std; int n; int price[MAX],beauty[MAX];
int func(int step,int counts,int now_beauty,int now_price) { while(step!=n){ if(now_beauty<beauty[step+1]) { if(price[step+1]<now_price) counts++; now_price=price[step+1]; now_beauty=beauty[step+1]; } step++; } return counts; }
int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++) cin>>beauty[i]; for(int i=1;i<=n;i++) cin>>price[i]; cout<<func(0,0,0,0); return 0; }
|
灯笼展
这题我的第一思路是走一步排序并找第k小,感觉慢了,后来发现只需要保证前k小即保证了第k个一定是最小的,也就是说,这个题需要每走一步维护一次前k小的数。
代码:
#include <bits/stdc++.h> #define MAX 100005 using namespace std; int n,k; priority_queue<int> q;
int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>k; vector<int> a(n); for(auto& x : a) cin>>x; for(auto &x:a) { if(q.size()<k||q.top()>x) cout<<"-1"<<endl; else cout<<q.top()<<endl; q.push(x); if(q.size()>k) q.pop(); }
return 0; }
|
这个代码有几点注意的地方,首先是容器vector和priority_queue()。使用vector代替数组时要注意先输入n再定义vector,否则会出现经典的segment fault!!!然后priority_queue()是一个可以自己排序的一个队列,push元素进入时会自动排序并使最顶的元素为最大值,即从小到大排序,这样每走一次将该元素入队,自动排序后判断队列长度和k的大小关系,使该队列数字保持在k个且是前k小,之后每次达成条件输入队顶数字即可。