A.Replacing Elements
题意:可选择不相同的i,j,k,使得ai=aj+ak。问能否使所有的ai<=d。
题解:用最小的两个ai的和替代所有>d的数,不能替代则不能。
#include<bits/stdc++.h>
using namespace std;
int a[110];
int main()
{
int t, n, d, i;cin >> t;
while (t--){
cin >> n >> d;
for (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;
}
}
}
B. String LCM
题意:求s串、t串的最小公倍串。
题解:设|s|为s串的长度,|t|为t串的长度,lcm=LCM(|s|, |t|)是|s|、|t|的倍数。s串、t串本身分别作为循环节,lcm/|s|、lcm/|t|分别作为循环次数。比较最终串是否相同。
#include<bits/stdc++.h>
using namespace std;
string s, t;
int gcd(int a, int b)
{
return !b ? a : gcd(b, a % b);
}
string mul(string str, int k)
{
string res = "";
while (k--)
res += str;
return res;
}
int main()
{
int q, i;cin >> q;
while (q--){
cin >> s >> t;
int ss = s.length(), tt = t.length();
int lcm = ss * tt / gcd(ss, tt);
if (mul(s, lcm / ss) == mul(t, lcm / tt)) cout << mul(s, lcm / ss) << endl;
else cout << -1 << endl;
}
}
C
找规律。前半部分是1,2,…,2k-n(不包括),后半部分是k,k-1,…,2k-n(包括)。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t, n, k, i;cin >> t;
while (t--){
cin >> n >> k;
int p = 0;
for (i = 1; i < 2 * k - n; i++){
!p ? cout << i : cout << ' ' << i;
p++;
}
for (i = k; i >= 2 * k - n; i--){
!p ? cout << i : cout << ' ' << i;
p++;
}
cout << endl;
}
}