A. SSeeeeiinngg DDoouubbllee
题意:
第一题题意很简单,即给出一个字符串,创造一个新字符串使得其是原字符串的两倍,且为一个回文串。
思路:
将原字符串倒置成为新字符串,然后接到原字符串后面即可
void solve()
{
string s, t;
cin >> s;
t = s;
reverse(t.begin(), t.end());
cout << s + t << endl;
}
B - XOR = Average
题意:
给出一个n,求满足下列等式的a1,a2,a3...an
思路:
将左式的连续异或看做常数c,整理式子即为n * c = a1 + a2 + a3 + ... + an
如要满足式子,则其中一种解法为:使a1,a2...an全为c
于是分为两种情况
1.如果n为奇数,当a数组全为c时,异或值同样始终为c,满足等式,c为任意值。
2.如果n为偶数,若a数组全为c,则异或值为0。思考如何让a数组大部分值等于c,且异或值也为c。即输出n - 2 个c和一个1,一个c + 1。
void solve()
{
int n;
cin >> n;
if (n % 2 == 1){
for (int i = 1; i <= n; i ++) cout << 1 << ' ';
cout << endl;
}else {
for (int i = 1; i <= n - 2; i ++) cout << 2 << ' ';
cout << 1 << ' ' << 3;
cout << endl;
}
}
C. Almost All Multiples
题意:给出n,x,代表有n个数的排列和排列第一个数字是x,最后一个数字是1。排列中其他元素必须满足pi % i == 0,求最小字典序且满足条件的排列.
思路:
首先题意其实告知的就是给出一个最小排列,a1和an交换,然后a1和ax交换后的初始化数组,也就是说,在满足n % x == 0的条件下,我们需要找到它的最小字典序,也就是假如排列后有满足n % i == 0 && i % x == 0的情况,就可以将x后移,否则输出-1。
void solve()
{
int n, x;
cin >> n >> x;
for (int i = 1; i <= n; i ++) a[i] = i;
swap(a[n], a[1]);
swap(a[1], a[x]);
if (n == x){
swap(a[n], a[1]);
for (int i = 1; i <= n; i ++) cout << a[i] << ' ';
cout << endl;
}
else if (n % x == 0){
int id = x;
for (int i = x + 1; i < n; i ++){
if (n % i == 0 && i % id == 0){
swap(a[id], a[i]);
id = i;
}
}
for (int i = 1; i <= n; i ++) cout << a[i] << ' ';
cout << endl;
}else {
cout << -1 << endl;
}
}
D. Range = √Sum
题意:给一个n,求出满足下列等式的a1,a2,a3...an
思路:分成奇数偶数分别判断
1.若n为偶数,则n-3,n-2,n-1,n+1,n+2,n+3的和为n方,且an-a1=6=n,故只需要输出n左右两边n/2项即可
2.若n为奇数,会复杂一些。因为an-a1=n为奇数会不好算,则设n+1为极差,又因为n为奇数,所以左右两边项数不一致。做法是,将最左边的那项移去,加到n+1右边的(n+1)/2项中,即可保证n项之和为(n+1)方.
设tmp为(n+1)/2,极差为:n+2+tmp-(n+2-tmp)==n+1.故得证。
void solve()
{
int n;
cin >> n;
if (n % 2 == 0){
for (int i = n - n / 2; i < n; i ++) cout << i << ' ';
for (int i = n + 1; i <= n + n / 2; i ++) cout << i << ' ';
cout << endl;
}else {
int tmp = (n + 1) / 2;
for (int i = n + 2 - tmp; i <= n; i ++) cout << i << ' ';
for (int i = n + 3; i <= n + 2 + tmp; i ++) cout << i << ' ';
cout << endl;
}
}
总结:对于构造题,思路要灵活放开,对数字要有敏感性。规律其实并不复杂,但推出规律会很难。
对于给出一个n,求a数组的构造题,可以从n的奇偶性之类的着手,先求出一种的规律,另一种肯定和它大差不差。
对于给出公式要求规律的构造,可以考虑将公式变形,得到较为方便的形式以便推出规律。