CodeForces1234总结

传送门
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)∣ 的值

猜你喜欢

转载自blog.csdn.net/weixin_46434074/article/details/107496933