题1:数的计算https://www.luogu.com.cn/problem/P1028
给出正整数 �n,要求按如下方式构造数列:
请你求出,一共有多少个合法的数列。两个合法数列 �,�a,b 不同当且仅当两数列长度不同或存在一个正整数 �≤∣�∣i≤∣a∣,使得 ��≠��ai=bi。
输入只有一行一个整数,表示 �n。
输出一行一个整数,表示合法的数列个数。
输入 #1复制
6
输出 #1复制
6
满足条件的数列为:
对于全部的测试点,保证 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<
一个正整数,正读和反读都相同的数为回文数,例如 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
思路:题目长,难度低,简而言之就是伞在某个黑子上,要找到其中一个黑子到最远黑子的距离的最小值,解决办法就是遍历所有的黑子,并且遍历除自己之外的黑子,找到最大距离,在和其他黑子的最大距离对比,找到那个最小的最远黑子
#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(将一个元素进栈)。
栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。
宁宁考虑的是这样一个问题:一个操作数序列,1,2,…,�1,2,…,n(图示为 1 到 3 的情况),栈 A 的深度大于 �n。
现在可以进行两种操作,
使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 1 2 3
生成序列 2 3 1
的过程。
(原始状态如上图所示)
你的程序将对给定的 �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今天就摆了四道题,马上进入考试周了,累累累累累