Codeforces Round #713 (Div. 3) 题解

前言

蒟蒻又来发题解了,今天都是思维题,又是烧脑写题的一天啊 QAQ
虽然当时做不出来,但是之后补题很快乐(^ - ^)!!!

A. Spy Detected!

A题原题戳这里

题目的大致意思:找到一个数组中不同于其他数字的数(水题,但是又又又考虑漏了一个关键点)

解题思路:既然那个数是与其它数字不相等,那么证明它与相邻的两个数都不相等,然后要考虑开头一个数和结尾的一个数,因为与它相邻的只有一个数。(因为这个导致提交罚时了QAQ)

题解:

#include<iostream>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		int a[n];
		for(int i=0;i<n;i++)cin>>a[i];
		//注意开头的一个数
		if(a[0]!=a[1]&&a[0]!=a[2]){
			cout<<"1"<<endl;
			continue;
		}
		int i=1;
		for(i=1;i<n-1;i++)
		if(a[i]!=a[i-1]&&a[i]!=a[i+1]){
		cout<<i+1<<endl;
		break;
	}
	//最后一个数符合题意,就是遍历所有数字都没有符合的数字
	if(i==n-1)cout<<n<<endl;
	}
	return 0;
}
  

B. Almost Rectangle

B题原题戳这里

题目的大致意思:对输入的只含点和星号字符的矩阵进行操作,添加两个星号字符使得四个星号字符能在一个矩形的四个角上。

解题思路:分三种情况讨论,给定的两个点既不同行又不同列的情况;给定的两个点同行不同列;两个点同列不同行。第一种情况就是将两个点的列互换就可以了;第二种情况就先将行下移移动或者向上移动(看是否越界),列不变;第三种情况就是将列左移或者右移(看是否越界),行不变。(注意千万不要把题目理解成要拼凑成一个正方形,这样看第四个测试例子会出错。(因为这里理解错了导致Wa了三次还没检查出来(QWQ))。

题解:

#include<iostream>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		int x1=0,x2=0,y1=0,y2=0;
		char a[n+1][n+1];
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++){
				cin>>a[i][j];
				//找到两个给定的点
				if(x1==0&&y1==0&&a[i][j]=='*'){
					x1=i;
					y1=j;
				}
				if(x1!=0&&y1!=0&&a[i][j]=='*'){
					x2=i;
					y2=j;
				}
			}
			if(x1!=x2&&y1!=y2){
				a[x1][y2]='*';
				a[x2][y1]='*';
			}
			//行相等时
			else if(x1==x2){
				x2++;
				if(x2>n)x2-=2;
				a[x2][y2]='*';
				a[x2][y1]='*';
			}
			//列相等时
			else {
				y2++;
				if(y2>n)y2-=2;
				a[x1][y2]='*';
				a[x2][y2]='*';
			}
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++)
					cout<<a[i][j];
				cout<<endl;
			}
	}
	return 0;
}

C. A-B Palindrome

C题原题戳这里

题目的大致意思:给定两个数字,是要求字符‘0’和‘1’的个数;在给定的只含‘0’,‘1’,‘?’字符的字符串内,用’1’和’0’替换中间的’?'使字符串能成回文串。

解题思路:第一遍遍历将已有的字符串变成回文串,然后统计一次’0’和’1’的个数,用,a,b减去已有的个数;将剩余的’?‘用还需要的’0’和’1’替换’?’,记得每次都是替换对称的两个’?’,用a,b减掉2。最后注意中间的那个字符,反转字符串,看是否是回文字符串。如果不能符合题目的要求,就输出-1。(大佬代码)

题解:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int a, b, n;
		cin >> a >> b;
		n = a + b;
		string s;
		cin >> s;
		for (int i = 0; i < n; i++)//替换字符
		{
			if (s[i] == '?')s[i] = s[n - i - 1];
		}
		a -= count(s.begin(), s.end(), '0');
		b -= count(s.begin(), s.end(), '1');
		for (int i = 0; i <= n / 2; i++) 
		{
			if (i != n - i - 1 && s[i] == '?')
			{
				if (a > 1)
				{
					s[i] = s[n - i - 1] = '0';
					a -= 2;
				}
				else if (b > 1)
				{
					s[i] = s[n - i - 1] = '1'; 
					b -= 2;
				}
			}
			else if (s[i] == '?')
			{
				if (a)
				{
					s[i] = '0';
					a--;
				}
				else
				{
					s[i] = '1';
					b--;
				}
			}
		}
		string t = s;
		reverse(t.begin(), t.end());//反转字符串
		if (t == s && a == 0 && b == 0)
			cout << s << '\n';
		else 
			cout << "-1\n";
 
	}
	return 0;
}

D. Corrupted Array

D题原题戳这里

题目的大致意思:给定数组b的数,在数组b中选择n个数字,使得n个数字的和也在b数组内,输出在b中选择的数字。(这数组b一定比a多两个数字)

解题思路:先对数组b进行sort排序,然后对前n+1个数字求和;然后遍历n次,减去每一次遍历的a数组值,即为n个数的和;去和第n + 2个数比较,然后特判一下,前n个数的和时是不是可能和第n + 1个数或第n + 2个数相等,不能满足条件就输出-1。(大佬代码)

题解:

#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 400010;
int T;
int n;
ll b[N]; 

int main()
{
	cin >> T;
	while(T --)
	{
		cin >> n;
		for(int i = 0;i < n + 2;i ++) cin >> b[i];
		sort(b,b + n + 2);//排序
		ll sum = 0;
		for(int i = 0;i < n + 1;i ++) sum += b[i];//求和
		int id = -1;
		for(int i = 0;i < n;i ++){//判断能否有和与之相等的数
			if((sum - b[i]) == b[n + 1]){
				id = i;
				break;
			}
		}
		if(id == -1){//继续判断
			sum -= b[n];
			if(sum == b[n + 1]) id = n;
			else if(sum == b[n]) id = n;
		}
		if(id == -1){
			cout << id << endl;
		}
		else{
			for(int i = 0;i < n + 1;i ++){
				if(i != id) cout << b[i] << " ";
			}
			cout << endl;
		}
		memset(b,0,sizeof b);
	}
	return 0;
}

总结

能力有限,暂时只能解到这一题惹,剩余的题以后再更新(~ - ~)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值