传送门
A. Equalize Prices Again
大意:商店内有n件商品,现给你n件商品的价格,将所有商品价格调整成一样的但不能亏本,问最小的价格是多少。
水题,向上取整即可。
B. Social Network (easy version)
大意:一个屏幕只能放下k条消息,现有n条消息,当有新消息时新消息会置顶,相同的消息位置不会变,问最终屏幕上的消息数量及消息顺序。
简单模式:用数组记录消息的顺序,消息的数量用总数减去不在屏幕上的数量即可。
困难模式:官方题解是用set记录此元素是否在队列中,减少查询时间,看一下困难模式的代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, k;
cin >> n >> k;
queue<int> q;
set<int> s;
for(int i = 1; i <= n; i++){
int id;
cin >> id;
if(!s.count(id)){ // 元素此时是否在set中
if(q.size() >= k){ // 屏幕中元素是否达到上限
int cur = q.front();
q.pop(); // pop出
s.erase(cur); // set中也删除
}
q.push(id); // 推入新元素
s.insert(id);
}
}
int m = q.size();
cout << q.size() << endl;
vector<int> v;
while(!q.empty()){
v.push_back(q.front());
q.pop();
}
reverse(v.begin(), v.end()); // 反向输出
for(int i = 0; i < m; i++){
cout << v[i] << " ";
}
return 0;
}
C. Pipes
大意:有六种不同的管子,每种管子可以旋转,问水能否成功的从左上角流到右下角
思路:其实共两种管子,因为1 2可通过旋转得到,3 4 5 6同理。当上面的管子碰到向下的管子时,再遇到第一种管子就直接break结束循环,因为这种情况一定到不了右下了。
D. Distinct Characters Queries
大意:给你一个字符串,你可以将某位置的字符变成c或计算l~r间的不同字符串,共需进行q次操作
E. Special Permutations
大意:给你一个数n,数列p(i)是从1~n,把i提在最前面,其余按顺序排列,设pos(p,val)是元素val在p中的位置。计算∣pos(pi,x1)−pos(pi,x2)∣+…+∣pos(pi,xm−1)−pos(pi,xm)∣ 的值