Codeforces Round 872 (Div. 2)(前三道

A.LuoTianyi and the Palindrome String

思路:当回文有不同元素是只用删掉一个不同元素就可以破坏回文。

#include
using namespace std;
int t;
string a;
void slove(){
	int len = a.size();
	char tmp = a[0];
	for (int i=0;i<(len-1)/2+1;i++){
		if (tmp!=a[i]){
            cout<>t;
	while(t--){
		cin>>a;
		slove();
	}
}

B.LuoTianyi and the Table
 

思路:获取能得到的最大值h1和次最大值l1,并且让最大值覆盖的范围最大(n-1)*(m-1)

#include
#define ll long long
using namespace std;
ll t,n,m,b[110000];
int main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		for (int i=1;i<=n*m;i++) cin>>b[i];
		sort(b+1,b+n*m+1);
		ll H1 = b[n*m]-b[1],L1 = b[m*n-1]-b[1];// 有负数的情况
		if (n


 

c.LuoTianyi and the Show

  1. 考点:排序+贪心
  2. 思路:考虑三种情况:1.左边(指-1操作)先开始放,那么只能和插入(xi)操作配合;2.右边(指-2操作)先开始放,也只能和插入(xi)操作配合;3.先插入一个值,再在他的左右放。
  3. 如何实现:将会插入的值放入set(能自动排序);-1,-2使用map来记录出现次数;情况1就直接map[-1]+set.size()(因为放左边的操作碰到可以插入时,可以先插入再放左边),情况2同理map[-2]+set.size(),,情况3就遍历set,得到的一般式:set.size()+左边有几个空位最多放map[-1]+右边有几个空位最多放map[-2]。
#include
using namespace std;
int t,n,m;
set a;
map mapp;
int main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		mapp[-1]=0;mapp[-2]=0;a.clear();
		for (int i=1,num;i<=n;i++){
			cin>>num;
			if (num==-1||num==-2) 
				mapp[num]++;
			else
				a.insert(num);
		}
		int len = a.size();
		int ans = max(min(mapp[-1]+len,m),min(mapp[-2]+len,m));
		int l = 0;
		for (auto tmp : a){
			ans = max(ans,len+min(mapp[-1],tmp-l-1)+min(mapp[-2],m-tmp-(len-l-1)));
			l++;
		}
		cout<

下面笔者能力不够搞不了了qwq

D的除法取余可以看这篇(13条消息) 乘法逆元详解【费马小定理+扩展欧几里得算法】_LZRcqbz的博客-CSDN博客

你可能感兴趣的:(codeforces周赛,算法,c++,数据结构)