Codeforces Round 102 (Rated for Div. 2) A、B、C题

在这里插入图片描述在这里插入图片描述

思路:直接找数列中最小的两个值,如果两者之和小于等于给定的d,那么数列中其他的值也一定可以通过替换从而小于等于d,若数列中最大值小于d,则直接输出yes,其他就是no
C++代码

#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
 
int main()
{
    
    
	int t;
	cin >> t;
	while(t--)
	{
    
    
		int n, d;
		cin >> n >> d;
		int a[105];
		for(int i = 0; i < n; i ++)
			cin >> a[i];
		sort(a,a+n);
		if(a[n-1] <= d)cout << "YES"<< endl;
		else if(a[0] + a[1] <= d) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
}

在这里插入图片描述
思路:寻找字符串的最小循环子串,注意:需从头开始找!

#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
 
int fun(int a,int b)
{
    
    
	return b ? fun(b, a % b) : a;
}
 
int main()
{
    
    
	int t;
	cin >> t;
	while(t--)
	{
    
    
		string a,b;
		cin >> a >> b;
		string c,d;
		int len1 = a.size();
		int len2 = b.size();
		for(int i = 0; i < a.size(); i ++)  //找最小的整除(循环)子串
		{
    
    
			c+=a[i];
			int flag = 1;
			for(int j = i+1; j < a.size() && flag == 1; j += c.size() )
			{
    
    
				string s(a,j,c.size());
				if(c != s)
					flag = 0;
			}
			if(flag == 1)break;
		}
	//	cout << c;
		for(int i = 0; i < b.size(); i ++)  //与上一样
		{
    
    
			d+=b[i];
			int flag = 1;
			for(int j = i+1; j < b.size() && flag == 1; j += d.size() )
			{
    
    
				string s(b,j,d.size());
				if(d != s)
					flag = 0;
			}
			if(flag == 1)break;
		}
		//cout << c << "--" << d << endl;
		if(c==d)
		{
    
    
			int len3 = c.size();
			int a1 = len1/len3,a2=len2/len3;
			for(int i = 0; i < a1*a2/fun(a1,a2); i ++)
			{
    
    
				cout << c;
			}
			cout << endl;
		}
		else
		{
    
    
			cout << "-1" << endl;
		}
	}
	return 0;
}

膜拜下大佬代码:
在这里插入图片描述

C题原题连接在这里呦!!!
在这里插入图片描述
在这里插入图片描述
题目翻译:
你有一个序列a,有n个元素1,2,3,…,k−1,k,k−1,k−2,…,k−1(n−k)(k≤n<2k)。
我们把一对指数i<j称为a中的倒数,使得a[i]>a[j]。
假设你有一个大小为k的置换p,你用以下方式建立了一个大小为n的序列b: b[i]=p[a[i]]。
你的目标是找到这样的排列p,使得b中的倒装总数不超过a中的倒装总数,并且b在字典上是最大的。
小提示:如果k整数序列包含从1到k的所有整数正好一次,则称之为置换。
另一个小提示:如果s是t的前缀,或者对于第一个i,si≠ti,si<ti保持不变(在这些序列不同的第一个位置,s的数字比t小),
则序列s在词典上比另一个序列t小。
输入
第一行包含一个整数t(1≤t≤1000)-测试用例数。
每个测试用例的第一行也是唯一一行包含两个整数n和k(k≤n<2k;1≤k≤105)-序列a的长度及其最大值。
保证测试用例上k的总和不超过105。
输出
对于每个测试用例,打印k整数-排列p,它按字典顺序最大化b,而不增加反转的总数。
可以证明p的存在性和独特性。

在第一个测试用例中,序列a=[1],只有一个置换p=[1]。
在第二个测试用例中,序列a=[1,2]。aa中没有反转,所以只有一个置换p=[1,2],它不会增加反转的数量。
在第三个测试用例中,a=[1,2,1],有11个反转。如果我们使用p=[2,1],那么b=[p[a[1]],p[a[2]],p[a[3]]=[2,1,2],还有1个反转。
在第四个测试用例中,a=[1,2,3,2],既然p=[1,3,2],那么b=[1,3,2,3]。a和b都有1个倒装,b是词典编纂的最大值。

#include<bits/stdc++.h>

using namespace std;
const int N = 200;

int main(){
    
    
	int t;
	cin >> t;
	for(int j = 0;j < t;j++){
    
    
		int n,k;
		cin >> n >> k;
		for(int i = 1;i < 2*k-n;i++)   //第一个循环正序输出
			cout << i << " ";
		for(int i = 2*k-n; i <= k; ++i) //需要将数组倒序输出的地方
			cout << k-i+(2*k-n) << " ";
		cout << endl;
	}
    return 0;
}
 
 

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/112675140