A:SSeeeeiinngg DDoouubbllee
题意:给定一个字符串,每个字符串的字符可以出现两次,要求通过重新排列构造一个回文串。
思路:直接暴力可以,每个字符头部一个尾部一个。
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;
const int N=1000000+100;
int n ,m,h;
char s[N];
int main()
{
int t;
sc_int(t);
while(t--)
{
cin>>s+1;
int n=strlen(s+1);
for(int i=1;i<=n;i++)
{
s[2*n-i+1]=s[i];
}
for(int i =1;i<=2*n;i++)
cout<<s[i];
cout<<endl;
}
return 0;
}
B:XOR = Average
题意:让你构造一个长度为 n 的数组,使得数组的平均值等于数组的异或和。
思路:由奇数得可以全部都为相同的数,如果是偶数,那么可以数组的平均数都是2,然后第一个2-1放到最后一个2的位置,这样中间的xor都是0,最后的异或的结果也是2,
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;
const int N=1000000+100;
int n ,m,h;
ll s[N];
int main()
{
int t;
sc_int(t);
while(t--)
{
ll res=0;
cin>>n;
if(n%2!=0)
{
for(int i =1;i<=n;i++)
cout<<n<<" ";
}
else
{
cout<<1<<" ";
for(int i =2;i<n;i++){
cout<<2<<" ";
}
cout<<3<<" ";
}
cout<<endl;
}
return 0;
}
C: Almost All Multiples
题意:给你一个x和n,让你构造一个长度为n的数组并且第一个数是x最后一个是1并且数组的每一位要保证能够取余i。并且构造这个字典序最小的数组,如果没有就输出-1.
思路:首先如果,那么在除了x和1之外的每个元素都不能让位置给n,那么一定就构造不了。
否则可以构造一个数组,就是x和n的位置互换的情况,然后要考虑最小的字典序的情况,即n的位置尽可能的跟后面的数字交换(要换的数能整除当前n的下标并且n能整除要换的数的下标),直接暴力搜一遍就可以了。
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;
const int N=1000000+100;
int n ,m,h;
ll s[N];
int main()
{
int t;
sc_int(t);
while(t--)
{
sc_int(n),sc_int(m);
if(n%m!=0){
cout<<-1<<endl;
continue;
}
else
for(int i =1;i<=n;i++)
{
if(i==1)s[i]=m;
else if(i==n)s[i]=1;
else if(i==m)s[i]=n;
else s[i]=i;
}
int l=m,lx=s[l];
for(int i =m+1;i<=n;i++)
{
if(s[i]%l==0&&lx%i==0)
{
swap(s[i],s[l]);
l=i;
}
}
for(int i =1;i<=n;i++)
cout<<s[i]<<" ";
cout<<endl;
}
return 0;
}
D题自己写出来了但是思路不好说,因为我自己是打表找出来的规律(欸嘿~),感觉这次的构造题都挺考验打表的,以后还是继续努力吧!