栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

AtCoder 235 A~D题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AtCoder 235 A~D题

AtCoder Contest 235 A - Rotate

【题目链接】A - 旋转 (atcoder.jp)

【代码实现】

#include
#include
#include
#include

using namespace std;

//abc+bca+cab: 
//123 231 312 :231在123基础上将1移到23后 312在231的基础上将2移到最后面 
//也就说:从第二个数开始,每一个数都是在前一个的基础上将第一个字符移到最右边
//因此我们可以先用字符串构造这3个数,在将它们转为数字即可! 

int main()
{
	string s1, s2, s3;
	cin >> s1;
	char a = s1[0], b = s1[1];
	 
	 s2 = s1.substr(1,3) + a;
	 s3 = s2.substr(1,3) + b;
	 
//	 cout << s1 << ' ' << s2 << " " << s3 << endl;
	 int num1 = stoi(s1), num2 = stoi(s2), num3 = stoi(s3);
	 cout << num1 + num2 + num3 ;

	 
	return 0;
}
B - Climbing Takahashi

【题目链接】B - 攀登高桥 (atcoder.jp)

【代码实现】

#include
#include
#include
#include

using namespace std;

typedef long long LL; 
const int N = 1e5 + 10;
int a[N];

// 找到 第一个 >= 它右边第一个数的数 

int main()
{
	
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n ; i ++) scanf("%d", &a[i]);
	
	for(int i = 0; i < n; i ++)
	{
		if(a[i] >= a[i + 1])
		{
			printf("%d", a[i]);
			break;
		}
	}
	
	return 0;
}
C - The Kth Time Query

【题目链接】C - 第 K 次时间查询 (atcoder.jp)

刚刚开始想到的就是二分,然后给搜到的数做个标记,跳过出现过的位置,balabala搞不出来,后面看了题解,可以用一个哈希表将这个数和该数出现的所有位置做一个映射!

【代码实现】

#include
#include
#include
#include

using namespace std;

//关联数组:将输入的数a 与 a出现的所有位置关联起来 ——映射关系(哈希表里边嵌套使用vector)  
//序列 1 1 2 3 2 1
//如 m[1]={1, 2, 6}
//   m[2] = {3,5}
//   m[3] = {4} 

int main()
{
	int n , q;
	scanf("%d%d", &n, &q);
	
	unordered_map> query;
	
	for(int i = 1; i <= n; i ++)
	{
		int a;
		scanf("%d", &a);
		query[a].push_back(i);
		
	}
	while(q --)
	{
		int a, k;
		scanf("%d%d", &a, &k);
		
		if(query.find(a) == query.end()) puts("-1");// 没有这个数
		else if(query[a].size() < k) puts("-1");//查询次数 超过 该数的出现次数
		else printf("%dn", query[a][k - 1]); // 注:vector里边存的数下标从0开始 
		
	}
	return 0;
}
D - Multiply and Rotate

【题目链接】D - 乘法和旋转 (atcoder.jp)

题目意思:

给定初始值为 x = 1, 两种操作方式

第一种是将 x 替换为 a * x,第二种是将 x 视为字符串,当前仅当满足 x 大于等于 10且x 不能被 10 整除, 将 x 的最右端字符放到最左端。

求解 由x = 1变到N 时的最小操作次数。

思路:

初始状态1,目标状态N

BFS最小步数模型,状态为操作1的相乘和操作2的换位(根据题意转为字符串后将换位拼接即可)

注:

a与N的范围都在2~10^6之间,对于操作1,当 当前状态 * a(相乘)可能会导致结果溢出,为此要直接开long long

【代码实现】

#include
#include
#include
#include
#include

using namespace std;

queue q;
const int N = 1e6 + 10;

typedef long long LL;

int d[N];
bool st[N];

LL a, n; // 为了防止 a 与 N 相乘结果溢出 直接开long long!  坑啊!  

int bfs()
{
	q.push(1);
	d[1] = 0;
	
	while(q.size())
	{
		auto t = q.front();
		q.pop();
		
		if(t == n) return d[n];
		
		if(st[t]) continue;
		st[t] = true;
		
		//扩展队头元素
		if( t * a <= N)
		{
			q.push(t * a);
			d[t * a] = d[t] + 1;	
		}
		if(t > 10 && t % 10 != 0)
		{
			string str = to_string(t);
			int len = str.size();
			char a = str[len - 1];
			string newStr = a + str.substr(0, len - 1);	
			int nums = stoi(newStr);
			q.push(nums);
			d[nums] = d[t] + 1;
		} 
	}
	
	return -1;
	
}

int main()
{
	cin >> a >> n;
	
	cout << bfs();
	
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/713826.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号