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; } } }