洛谷刷题的第n+2天

题1:数的计算https://www.luogu.com.cn/problem/P1028

题目描述

给出正整数 �n,要求按如下方式构造数列:

  1. 只有一个数字 �n 的数列是一个合法的数列。
  2. 在一个合法的数列的末尾加入一个正整数,但是这个正整数不能超过该数列最后一项的一半,可以得到一个新的合法数列。

请你求出,一共有多少个合法的数列。两个合法数列 �,�a,b 不同当且仅当两数列长度不同或存在一个正整数 �≤∣�∣i≤∣a∣,使得 ��≠��ai​=bi​。

输入格式

输入只有一行一个整数,表示 �n。

输出格式

输出一行一个整数,表示合法的数列个数。

输入输出样例

输入 #1复制

6

输出 #1复制

6

说明/提示

样例 1 解释

满足条件的数列为:

  • 66
  • 6,16,1
  • 6,26,2
  • 6,36,3
  • 6,2,16,2,1
  • 6,3,16,3,1

数据规模与约定

对于全部的测试点,保证 1≤�≤1031≤n≤103。

思路:可以通过数学的方法,找到递推关系,例如在给出的样例中,

6,6->1,6->2,6->3,6->2->1,6->3->1可以知道,f[6]=1+f[1]+f[2]+f[3]

所以可以通过两层循环完成这样的递推关系

#include
#include
#include
using namespace std;
int main()
{
	int n;
	cin>>n;
	long long dp[1005]={0};
	for (int i=1;i<=n;++i)
	{
		for (int j=1;j<=i/2;++j)
		{
			dp[i]+=dp[j];
		}
		dp[i]++;
	}
	cout<

题2:求回文数https://www.luogu.com.cn/problem/B3882

题目描述

一个正整数,正读和反读都相同的数为回文数,例如 22,131,2442,37073,6,⋯22,131,2442,37073,6,⋯。所有的 11 位数都是回文数。

现给出一个正整数 �n,求出 [1,�][1,n] 中的回文数的个数。

输入格式

一个整数 �n。

输出格式

一个整数,即 1∼�1∼n 中全部回文数的个数。

输入输出样例

输入 #1复制

24

输出 #1复制

11

说明/提示

样例解释

在 11 至 2424 中,回文数有 1∼9,11,221∼9,11,22,共 1111 个。

数据范围

1≤�≤1041≤n≤104。

思路:判断回文数的问题,之前已经写过了,所以这道题还是很轻松的,这道题就是给出一个范围,求这个范围里的回文数个数,这里再次重复一下这个回文数的判断方法

就是把给出的正整数都压到一个字符数组里面,然后建立一个相反的数组,然后逐个判断,这里建立了一个动态的数组

bool ishuiwen(int n)
{
	vectora;
	while (n>0)
	{
		a.push_back(n%10);
		n/=10;
	}
	vectorb=a;
	reverse(b.begin(),b.end());
	for (int i=0;i
#include
#include
#include
using namespace std;
bool ishuiwen(int n)
{
	vectora;
	while (n>0)
	{
		a.push_back(n%10);
		n/=10;
	}
	vectorb=a;
	reverse(b.begin(),b.end());
	for (int i=0;i>n;
	if (n<=9)
	{
		cout<

题3:防护伞https://www.luogu.com.cn/problem/P1927

题目描述

据说 20122012 的灾难和太阳黑子的爆发有关。于是地球防卫小队决定制造一个特殊防护伞,挡住太阳黑子爆发的区域,减少其对地球的影响。由于太阳相对于地球来说实在是太大了,我们可以把太阳表面看作一个平面,中心定为 (0,0)(0,0)。根据情报,在 20122012 年时,太阳表面上会产生 �N 个黑子区域,每个黑子视为一个点。特殊防护伞可以看作一个巨大的圆面,现在地球防卫小队决定将它的中心定位于某个黑子,然后用伞面挡住其他黑子。因为制造防护伞的材料成本特别高,所以我们希望伞面尽可能的小。

输入格式

第一行:一个整数 �N,表示黑子个数。

第 22 到 �−1N−1 行:每行两个整数,表示黑子的坐标 (�,�)(x,y)。

输出格式

第一行:一个实数,表示伞的面积。

输入输出样例

输入 #1复制

3
0  1 
-8  -4 
-1  4 

输出 #1复制

279.6017

说明/提示

数据范围及约定

  • 对于 50%50% 的数据:2≤�≤1002≤N≤100。
  • 对于 100%100% 的数据:2≤�≤10002≤N≤1000,−10000≤�,�≤10000−10000≤x,y≤10000。

注意

  • 精确到小数点后 44 位。
  • �π 取 3.14159265353.1415926535。

思路:题目长,难度低,简而言之就是伞在某个黑子上,要找到其中一个黑子到最远黑子的距离的最小值,解决办法就是遍历所有的黑子,并且遍历除自己之外的黑子,找到最大距离,在和其他黑子的最大距离对比,找到那个最小的最远黑子

#include
#include
#include
#define PI 3.1415926535
using namespace std;
struct Weizhi{
	int x;
	int y;
};
int main()
{
	int n;
	cin>>n;
	Weizhi weizhi[1005];
	int  maxdis=1<<30;
	for (int i=0;i>weizhi[i].x>>weizhi[i].y;
	}
	for (int i=0;i

题4:栈https://www.luogu.com.cn/problem/P1044

题目背景

栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。

栈有两种最重要的操作,即 pop(从栈顶弹出一个元素)和 push(将一个元素进栈)。

栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。

题目描述

洛谷刷题的第n+2天_第1张图片

宁宁考虑的是这样一个问题:一个操作数序列,1,2,…,�1,2,…,n(图示为 1 到 3 的情况),栈 A 的深度大于 �n。

现在可以进行两种操作,

  1. 将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的 push 操作)
  2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的 pop 操作)

使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 1 2 3 生成序列 2 3 1 的过程。

洛谷刷题的第n+2天_第2张图片

(原始状态如上图所示)

你的程序将对给定的 �n,计算并输出由操作数序列 1,2,…,�1,2,…,n 经过操作可能得到的输出序列的总数。

输入格式

输入文件只含一个整数 �n(1≤�≤181≤n≤18)。

输出格式

输出文件只有一行,即可能输出序列的总数目。

输入输出样例

输入 #1复制

3

输出 #1复制

5

思路:这道题有点烦,用动态规划做,一开始用dfs做,在测试最后一个样例的时候会超时。

#include
#include
#include
//1 2 3 push pop push pop push pop
//1 3 2	push pop posh push pop pop	
//2 1 3	push push pop pop posh pop
//2 3 1	push push pop push pop pop 
//3 2 1	push push push pop pop pop
//1 0 0
//0 0 0
//0 0 0
using namespace std;
long long n,dp[20][20];
long long  dfs(int x,int y)
{
	if (dp[x][y]!=0) return dp[x][y];
	if (x==0) return 1;
	if (y>0) dp[x][y]+=dfs(x,y-1);
	dp[x][y]+=dfs(x-1,y+1);
	return dp[x][y];
}
int main()
{
	cin>>n;
	cout<

这段代码可能有一点难理解,我会得到元素的总数n,和栈里面的数量0,开始递归,如果当前的栈中有数,就是y-1,出栈,同时每一次递归都需要减少元素的总数,把它压到栈里面,理由很简单就是,当前各自的数量,肯定是由去掉栈中一个元素的数量+去掉总数的数量之和得到。

ok今天就摆了四道题,马上进入考试周了,累累累累累

你可能感兴趣的:(算法)