思路:直接找数列中最小的两个值,如果两者之和小于等于给定的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;
}