IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Codeforces Round #713 (Div. 3) 题解 -> 正文阅读

[数据结构与算法]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;
}

总结

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:45:16  更:2021-08-22 13:47:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:32:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码