洛谷 P1061 Jam的计数法
题解:
相关变量解释:
int s,t,w;
int tot=;//最多输出五组
int maxNum[maxn];//maxNum[i] : i 位置可以达到的最大值
char letter[maxn];
深搜步骤:
(1):预处理出num[ ],maxNum[ ]
for(int i=;i <= w;++i)
num[i]=letter[i-]-'a'+;//将单词转换成数字
for(int i=w;i >= ;--i)
maxNum[i]=t--;//求出i位置可达到的最大值
(2):从w开始往前遍历,找到数值可以变大的位置,在通过Dfs( )求出由于当前位置影响而满足条件的Jam数
int index=w;
while(index >= )//从后往前遍历
{
while(num[index] < maxNum[index])//判断当前位置是否可以变得更大
{
num[index]++;
Dfs(index,index+,num);//求出受当前位置变大的影响的Jam数
}
index--;
}
(3):Dfs( )
void Dfs(int start,int curPos,int num[])
{
if(tot == )
return ;
//curPos == w+1 作用 : 特判index == 1的情况
if(curPos == w || curPos == w+)
{
if(curPos == w)//特判
num[w]=num[w-]+;
while(num[w] <= maxNum[w])//判断w位置的数是否可以变大
{
Print(num);//打印答案
tot++;
if(tot == )
return ;
num[w]++;
}
int prePos=w-;//回溯,查找w位置之前,start位置之后第一个变大的位置
while(prePos > start && num[prePos] == maxNum[prePos])
prePos--;
if(prePos > start)//找到
{
num[prePos]++;
Dfs(start,prePos+,num);
}
return ;
}
num[curPos]=num[curPos-]+;
Dfs(start,curPos+,num);
}
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=; int s,t,w;
int tot=;//最多输出五组
int maxNum[maxn];//maxNum[i] : i 位置可以达到的最大值
char letter[maxn]; void Print(int num[])
{
for(int i=;i <= w;++i)
printf("%c",num[i]-+'a');
printf("\n");
}
void Dfs(int start,int curPos,int num[])
{
if(tot == )
return ;
if(curPos == w || curPos == w+)
{
if(curPos == w)
num[w]=num[w-]+;
while(num[w] <= maxNum[w])
{
Print(num);
tot++;
if(tot == )
return ;
num[w]++;
}
int prePos=w-;
while(prePos > start && num[prePos] == maxNum[prePos])
prePos--;
if(prePos > start)
{
num[prePos]++;
Dfs(start,prePos+,num);
}
return ;
}
num[curPos]=num[curPos-]+;
Dfs(start,curPos+,num);
}
void Solve()
{
int num[maxn];
for(int i=;i <= w;++i)
num[i]=letter[i-]-'a'+;//将单词转换成数组
for(int i=w;i >= ;--i)
maxNum[i]=t--;//求出i位置可达到的最大值
int index=w;
while(index >= )
{
while(num[index] < maxNum[index])
{
num[index]++;
Dfs(index,index+,num);
}
index--;
}
}
int main()
{
scanf("%d%d%d",&s,&t,&w);
scanf("%s",letter);
Solve();
}
Dfs
大神Dfs()精简代码:
https://rainman.blog.luogu.org/solution-p1061
#include<bits/stdc++.h>
using namespace std; int s,t,w,c;
int a[],cnt; inline void output()
{
for(int i=;i<=w;i++)
cout<<(char)('a'+a[i]-);
cout<<endl;
} void dfs(int pos,int step)
{
if(pos==)
return;
if(step == )
return;
if(a[pos] < t && a[pos] < a[pos+]-)
{
a[pos]++;
for(int i=pos+;i<=w;i++)
a[i]=a[i-]+;
output();
dfs(w,step+);
}
else
dfs(pos-,step);
} int main()
{
cin>>s>>t>>w;
fflush(stdin);
while((c=getchar())!=EOF)
{
int temp=c-'a'+;
if(temp>=&&temp<=)
a[++cnt]=temp;
}
a[w+]=0x7f;
dfs(w,);
return ;
}
Dfs
洛谷 P1061 Jam的计数法的更多相关文章
- 洛谷P1061 Jam的计数法
题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...
- 【题解】洛谷 P1061 Jam的计数法
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int ...
- 【洛谷P1061 Jam的计数法】搜索
分析 超级暴力,在尾部+1,再判断. AC代码 type arr=array[0..27]of longint; var st:string; a:array[0..27]of longint; s, ...
- 1140 Jam的计数法
1140 Jam的计数法 2006年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descri ...
- Codevs 1140 Jam的计数法 2006年NOIP全国联赛普及组
1140 Jam的计数法 2006年NOIP全国联赛普及组 传送门 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Jam是个喜欢标 ...
- 洛谷 P1596 [USACO10OCT]湖计数Lake Counting
题目链接 https://www.luogu.org/problemnew/show/P1596 题目描述 Due to recent rains, water has pooled in vario ...
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...
- Jam的计数法
Jam的计数法 题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数 ...
- Codevs 1140 Jam的计数法
1140 Jam的计数法 题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个 ...
随机推荐
- python数据结构算法学习自修第一天【数据结构与算法引入】
1.算法引入: #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ from Queue import Queue import time que = Queu ...
- Mayor's posters(线段树+离散化)
这道题最关键的点就在离散化吧. 假如有三张海报[1, 10] [10, 13][15, 20] 仅仅三个区间就得占用到20了. 但是离散化后就可以是[1, 2] [2, 3] [4, 5] n到1e ...
- c++中结构体sort()排序
//添加函数头 #include <algorithm> //定义结构体Yoy typedef struct { double totalprice; //总价 doubl ...
- Codeforces Round #449 Div. 1
B:注意到nc/2<=m,于是以c/2为界决定数放在左边还是右边,保证序列满足性质的前提下替换掉一个数使得其更靠近边界即可. #include<iostream> #include& ...
- POJ 1125-Stockbroker Grapevine-最短路
裸最短路 /*--------------------------------------------------------------------------------------*/ // H ...
- My Brute HDU - 3315(KM || 费用流)
题意: 有S1到Sn这n个勇士要和X1到Xn这n个勇士决斗,初始时,Si的决斗对象是Xi. 如果Si赢了Xi,那么你将获得Vi分,否则你将获得-Vi分. Si和Xi对决时,Si有初始生命Hi,初始攻击 ...
- 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游 LCT 泰勒展开
题目大意 给你一棵树,每个点有一个函数\(f(x)\) 正弦函数 \(\sin(ax+b) (a\in[0,1],b\in[0,\pi],a+b\in[0,\pi])\) 指数函数 \(e^{ax+b ...
- bzoj 4542: [Hnoi2016]大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- IDEA 新建 module
maven项目可以创建多个module,在IDEA中具体操作 1.在已经建好的maven项目上右键 2.新建: 效果如下: 这时在子pom.xml中 <parent> <artifa ...
- Treap树 笔记
预备知识:二叉查找树.堆(heap).平衡二叉树(AVL)的基本操作(左旋右旋) 定义: Treap.平衡二叉树.Tree+Heap.树堆. 每个结点两个键值(key.priority). 性质1. ...