首页 > 其他 > 详细

题解 CF813B 【The Golden Age】

时间:2020-05-09 20:54:59      阅读:35      评论:0      收藏:0      [点我收藏+]

这题的具体思路楼上的 dalao 已经说清楚了,但没有代码,我这个小蒟蒻就补一发代码吧。

这道题目中的“不幸年”的个数不好确定,那么怎么办?

当然是用 C++ 的精髓 STL!

下面我来简单介绍一下 vector。

vector 的好处:

STL中有一个很好的容器 vector,它的大小根据元素的数量而改变,极其省空间。另外 vector 也有一个函数 push_back,可以直接把元素插入到一个 vector 的末尾。

那么,本题用 vector 就是再好不过啦!

vector 的定义:

vector 的定义如下:

vector<typename> name;

这相当于定义了一个一维数组 name[size],其中 size 的大小不确定,根据需要而变化。typename 可以为任意一基本类型,如 int、double、结构体等,也可以是 STL 的容器,包括 vector。

如果想定义一个二维的 vector,就可以这样:

vector<typename> name[size]

其中第一维确定,第二维不确定。

vector 的访问:

vector 的访问主要有两种形式,一种是下标访问,另一种是定一迭代器,如下:

vector<typename>::iterator it

我个人习惯用下标访问(主要是因为懒)。

vector 的常用函数:

(1) push_back() 和 pop_back

push_back()是用来在 vector 的末尾插入元素,pop_back() 则是删除。

(2)size()

size() 是用来获取 vector 里元素的个数。

(3)clear()

clear() 用来清除 vector 里的元素。

(4)begin() 和 end()

分别获取 vector 的首地址和尾地址。

还有 insert() 和 erase() 这两个请自行百度。

接下来,就是可爱的代码了:

#include<bits/stdc++.h>
using namespace std;
long long x,y,l,r;
vector<long long> v;    //定义 vector 
int main()
{
	cin>>x>>y>>l>>r;
	if(x==1)        //这里需要特判,如果 x=1 或 y=1,那么无论几次幂都是一。  
	    x=0x3f3f3f3f3f3f3f3f;
	if(y==1)
	    y=0x3f3f3f3f3f3f3f3f;
	for(long long i=1;;i*=x)
	{
		for(long long j=1;;j*=y)
		{
			if(i+j>=l&&i+j<=r)     //求出满足在 [l,r] 区间内的不幸年,把它放进 vector。 
				v.push_back(i+j);    
			if(r/j<y)    //如果超过了,跳出循环。 
			    break;
		}
		if(r/i<x)  //同上。 
		    break;
	}
	sort(v.begin(),v.end());   //将整个 vector 排个序。 
	if(v.size()==0)            //特判,如果没有一个不幸年,那么长度就是整个区间。 
	{
	    cout<<r-l+1;
		return 0;
	}
	long long ans=max(v[0]-l,r-v[v.size()-1]);   //不要忘了开头和末尾哟。 
	for(int i=0;i<v.size()-1;i++)    //逐一计算两个不幸年之间的年数,更新答案。 
	    ans=max(ans,v[i+1]-v[i]-1);
	cout<<ans;   //输出。 
	return 0;
}

逃(

题解 CF813B 【The Golden Age】

原文:https://www.cnblogs.com/win10crz/p/12859685.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!