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 #686 (Div. 3) 题解 -> 正文阅读

[数据结构与算法]Codeforces Round #686 (Div. 3) 题解

前言

和神仙队友们解题就是很快乐!虽然没写很多题,但是效率很高!

A. Special Permutation

A题原题戳这里

题目的大致意思:输出从1到n的一个排列(只要不是自然数排列直接输出就可以了)(水题~太急躁wa了一次( ~ - ~))

题解:

#include<iostream>
using namespace std;
int main()
{
	int t, n;
	cin >> t;
	while (t--)
	{
		cin >> n;
		cout<< n ;
		for (int i = 2; i <= n; ++i)
			cout << " " << i ;
		cout << endl;
	}
	return 0;
}

B. Unique Bid Auction

B题原题戳这里

题目的大致意思:找到数组中不重复的最小的数字并输出其索引(从1开始)(水题~)

解题思路:用一个数组储存原数组,另一个数组进行升序排序,找到最小与两端相邻的元素都不相同的数据就是需要找的数,找不到就输出-1。
题解:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
	int t;
    cin >> t;
	while(t--){
		ll n;
		cin>>n;
		int a[n+1],b[n+1],min=-1;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			b[i]=a[i];
		}
		sort(b+1,b+1+n);
		if(b[1]!=b[2])min=b[1];
		else{
			int i;
		for(i=2;i<n;i++){
			if(b[i-1]!=b[i]&&b[i+1]!=b[i]){
			min=b[i];
			break;
			}
		}
		if(b[n]!=b[n-1]&&i==n)min=b[i];
		}
		if(min==-1)cout<<min<<endl;
		else{
			for(int j=1;j<=n;j++){
				if(a[j]==min){
				cout<<j<<endl;
				break;
			}
		}
	}
	}
    return 0;
}

C. Sequence Transformation

C题原题戳这里

题目的大致意思:进行最少的操作次数,每次删掉两个相同数字之间的所有元素(中间不能包括相同的数字),使得最后留下来的的数字都相等。

解题思路:先将头尾连续的元素去掉,再利用map找到利用相同元素将数组划分为最小个数的小段+1就是答案(大佬队友思路~)
题解:

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int a[200001];
int flag ;
int main()
{
	int t, n;
	cin >> t;
	while (t--)
	{
		cin >> n;
		map<int, int> b;
		flag = 200001;
		for (int i = 0; i < n; ++i)
		{
			cin >> a[i];
			if (i == 0)
				continue;
			else if (a[i] != a[i - 1])
				b[a[i]]++;
		}
		b[a[n - 1]]--;
		for (int i = 0; i < n; ++i)
		{
			flag = min(b[a[i]], flag);
		}
		cout << flag + 1 << endl;
	}
	return 0;
}

D. Number into Sequence

D题原题戳这里

题目的大致意思:将一个数字n分成一个数组,这个数组的元素满足一下四个条件:
1.所有元素大于1
2.所有元素的累积为n
3.后面的元素可以被前一个元素整除
4.要求整个数组元素最多

解题思路:找到数字n的所有质因子,将n用质因子一直除,直到不能再除。找到能除次数最多的质因子,然后输出除的次数减1次质因子,最后输出操作后的得数。
1.为什么是质因子?如果只是因子,不是质数,那么还可以将因子分解为两个因子,就证明这个数组不是元素最多的数组。
2.为什么要一直除?因为相邻两个元素要求整除,那么相隔最小只能使商为1,即两个元素相等。
3.为什么是操作数减1?因为数组最后一个数必须能整除前一个数。

题解:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int Max,ans,I;//Max储存最多个数,ans现在的因子的个数,I能除次数最多的因子
void solve(ll n){
	Max=0,ans=0,I=0;
	for(ll i=2;i*i<=n;i++){//能够分解的因子
		if(n%i==0){
			while(n%i==0){//反复除
			ans++;
			n/=i;
			}
		}
		if(ans>Max){
			Max=ans;
			I=i;
		}
		ans=0;
	}
}
int main(){
	int t;
    cin >> t;
	while(t--){
		ll n;
		cin>>n;
		solve(n);
		if(Max==0){
			cout<<"1"<<endl<<n<<endl;
			continue;
		}//Max等于0证明没有因子,也就是素数,直接输出
		cout<<Max<<endl;
		for(int i=0;i<Max-1;i++){//保证最后一个数也能够被前一个整除的情况,只能少除一个因子I
			cout<<I<<" ";
			n/=I;
		}
		cout<<n<<endl;
	}
    return 0;
}

总结

写题真快乐!还有两题2000分以后再补…

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 12:07:09  更:2021-08-27 12:09:07 
 
开发: 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:57:28-

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