Codeforces Round 836 (Div. 2) A - C

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%n!=0,那么在除了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题自己写出来了但是思路不好说,因为我自己是打表找出来的规律(欸嘿~),感觉这次的构造题都挺考验打表的,以后还是继续努力吧!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值