A. Replacing Elements
题意:给你一个长度为n的数组和要求数组里最大的数k,你可以通过操作a[i]+a[j]=a[k]改变数组里每个数的值,问能不能通过操作是的数组满足所有元素都小于k。
思路:模拟,如果最小的两个数的和小于k即可,注意还有一种是像 4 2 ,2 2 2 2 这种,要特判,如果最大的元素也小于k,则一定满足.
#include <bits/stdc++.h>
using namespace std;
int a[1000];
int main()
{
int i,j,n,t,k;
cin>>t;
while(t--){
cin>>n>>k;
for(i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
if(a[n-1]<=k||(a[0]+a[1])<=k){
cout<<"YES"<<endl;
}
else
cout<<"NO"<<endl;
}
}
B. String LCM
题意:给你两个字符串a,b,求是否存在这两个字符串的LCM串。
思路:通过他们的长度去求lcm,然后再通过lcm/长度,求得放大的倍数,放大完之后再比较是否相等即可。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j,t;
cin>>t;
string s1,s2;
while(t--){
cin>>s1>>s2;
int d1=s1.length();
int d2=s2.length();
int ans;
ans=(d1*d2)/(__gcd(d1,d2));
int m1,m2;
m1=ans/d1,m2=ans/d2;
string sa,sb;
for(i=0;i<m1;i++)
sa+=s1;
for(i=0;i<m2;i++)
sb+=s2;
if(sb==sa)
cout<<sa<<endl;
else
cout<<-1<<endl;
}
}
C. No More Inversions
题意:给你一个数组 a:1,2,3,…,k−1,k,k−1,k−2,…,k−(n−k) (k≤n<2k).要找一个 p 排列p的长度为k,然后根据数组a和p生成数组b, 要求是,b数组中的逆序对数量不大于a数组中的逆序对数量,且字典序最大。
思路:蛮难理解的,当时是找规律思路有点混乱,数组a,他是递增到k再递减n-k个数,为了使数组b尽可能的大,应该想法是把大数往前,但是要考虑逆序对的数量。
列如如果是
a:1 2 3 4 3
则最大的b应该是 b: 1 2 4 3 4
所以 p: 1 2 4 3
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j,k,t;
cin>>t;
while(t--){
int n,k;
cin>>n>>k;
if(k==1){
cout<<1<<endl;
continue;
}
if(n==k){
for(i=1;i<=k-1;i++)
cout<<i<<" ";
cout<<k<<endl;
continue;
}
else {
for(i=1;i<=k-(n-k)-1;i++)
cout<<i<<" ";
for(i=k;i>=k-(n-k)+1;i--)
cout<<i<<" ";
cout<<i<<endl;
}
}
}