A
思路:
按照奇偶性对n进行分类:偶数直接相邻的两两互换;奇数则将前面n-3个相邻的两两互换,后面三个保证合法即可
codes:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long LL;
int test=1;
int n;
int main()
{
scanf("%d",&test);
while(test--)
{
cin >> n;
if(n%2==0)
{
for(int i=1;i<=n/2;i++)
{
cout << 2*i << " " << 2*i-1 << " ";
cout << '\n';
}
}
else
{
for(int i=1;i<=(n-3)/2;i++)
{
cout << 2*i << " " << 2*i-1 << " ";
}
printf("%d %d %d\n", n,n-2,n-1);
}
}
return 0;
}
B
思路:
将每个数字出现的次数记录下来,然后遍历找答案即可,如果没有出现次数为1 的,输出-1
codes:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
typedef long long LL;
int test=1;
int n;
int a[N], vis[N];
int main()
{
scanf("%d",&test);
while(test--)
{
cin >> n;
memset(vis, 0, sizeof vis);
for(int i=1;i<=n;i++)
{
cin >> a[i];
vis[a[i]] ++;
}
int res=-1;
for(int i=1;i<=n;i++)
{
if(vis[i]==1)
{
res = i;
break;
}
}
if(res==-1)
{
puts("-1");
continue;
}
for(int i=1;i<=n;i++)
{
if(a[i]==res)
{
cout << i << '\n';
break;
}
}
}
return 0;
}
C
思路:
首先,把那些相邻的且重复的元素都去掉,保证a[i] != a[i-1] && a[i]!=a[i+1]
然后可以发现,如果将所有的元素都替换为a[i]的话
- i=0, 那么 答案为a[i]出现的次数
- i>0, 那么 答案为a[i]出现的次数+1
这样的话,我们可以把所有元素的出现次数记录下来,然后选择最优的
codes:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int te=1;
int n,a[N];
int res[N];
int ans=N;
int main()
{
cin >> te;
while(te--)
{
ans = N;
// memset(res, 0, sizeof res);
cin >> n;
res[0] = 1;
for(int i=1;i<=n;i++)
{
cin >> a[i];
res[i]=1;
}
vector<int> vec;
vec.push_back(a[1]);
for(int i=2;i<=n;i++)
{
if(a[i]==a[i-1])
continue;
vec.push_back(a[i]);
}
for(int i=0;i<vec.size();i++)
{
res[vec[i]]++;
}
res[vec[0]]--;
res[vec[vec.size()-1]]--;
for(int i=0;i<vec.size();i++)
ans = min(ans, res[vec[i]]);
cout << ans << '\n';
}
return 0;
}
D
思路:
其实想法还是很直观的,对于一个数字n = p1 ^ a1 * p2 ^ a2 *** pk^ak
且把p按照各自的次数从大到小排序,
那么答案数组为
b1 b2 b3 … bm =
p1 p1 p1…
p2 p2
…
pk
这样能够保证 bi | bi-1
codes:
#include <bits/stdc++.h>
typedef long long LL;
using namespace std;
LL n;
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
LL ans=1,dis=n;
for(LL i=2;i<=sqrt(n);i++){
LL nn=n,now=0;
while(nn%i==0){
now++;
nn/=i;
}
if(ans<now){
ans=now;
dis=i;
}
}
cout << ans << endl;
for(LL i=1;i<ans;i++) cout<<dis<<" ",n/=dis;
cout<<n<<endl;
}
return 0;
}