01字串
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。Input
本试题没有输入。
Output
输出32行,按从小到大的顺序每行一个长度为5的01串。
Examples
Input
无
Output
00000 00001 00010 00011 <以下部分省略>
Time limit 1 second Memory limit 128 MB
采用模拟的方法,从末位往前修改,如果末位是0,改为1就行了,如果末位是1,把该位该为0,进行对前一位的修改,重复以上操作,五位一回车
以下代码:
#include<iostream>
using namespace std;
int main(){
int a[6]={0};
for(int k=1;k<=5;k++){
cout<<a[k];
}
cout<<endl;
for(int j=1;j<32;j++){
for(int k=5;k>=0;k--){
if(a[k]==1){
a[k]=0;
//k--;
//cout<<"k="<<k<<' ';
}
else if(a[k]==0){
a[k]=1;
break;
}
}
//cout<<"********"<<j<<"*******"<<endl;
for(int k=1;k<=5;k++){
cout<<a[k];
}
cout<<endl;
}
}
Fibonacci数列
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。Input
输入包含一个整数n。
Output
输出一行,包含一个整数,表示Fn除以10007的余数
Examples
Input
10
Output
55
Input
22
Output
7704
Hint
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
数据规模与约定
1 <= n <= 1,000,000。
Time limit 1 second Memory limit 128 MB
这道题没有什么硬的问题,遇到的问题是如果要开一个很大的数组,需要将数组定义到主函数外面。
将数组声明为全局变量
以下代码:
#include<iostream>
using namespace std;
//int F(int n){
// if(n==1||n==2){
// return 1;
// }else{
// return F(n-1)+F(n-2);
// }
//}
int f[1000010];
int main(){
//cout<<"****"<<endl;
f[1]=1;
f[2]=1;
for(int i=3;i<1000010;i++){
f[i]=f[i-1]+f[i-2];
f[i]%=10007;
}
//cout<<"****"<<endl;
int m;
cin>>m;
cout<<f[m]<<endl;
return 0;
}
FJ的字符串
FJ在沙盘上写了这样一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律并写所有的数列AN吗?Input
仅有一个数:N ≤ 26。
Output
请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
Examples
Input
3
Output
ABACABA
这道题开始想的有点复杂,我想的是对字符数组进行操作,但是这样就得对字符数组进行粘贴啥的,有点麻烦。参考了一下别人的代码,用得是递归的思想,很简洁好懂,一分钟就能敲完
以下代码:
#include<iostream>
using namespace std;
string s(int n){
if(n==1){
return "A";
}
else{
return s(n-1)+(char)('A'+n-1)+s(n-1);
}
}
int main(){
int m;
cin>>m;
cout<<s(m);
return 0;
}
Hankson的趣味题
Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson。现 在,刚刚放学回家的Hankson 正在思考一个有趣的问题。 今天在课堂上,老师讲解了如何求两个正整数c1 和c2 的最大公约数和最小公倍数。现 在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公 倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整 数x 满足: 1. x 和a0 的最大公约数是a1; 2. x 和b0 的最小公倍数是b1。 Hankson 的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的 x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x 的个数。请你帮 助他编程求解这个问题。
Input
输入第一行为一个正整数n,表示有n 组输入数据。
接下来的n 行每 行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入 数据保证a0 能被a1 整除,b1 能被b0 整除。
Output
输出共n 行。每组输入数据的输出结果占一行,为一个整数。
对于每组数据:若不存在这样的 x,请输出0; 若存在这样的 x,请输出满足条件的x 的个数;Examples
Input
2 41 1 96 288 95 1 37 1776Output
6 2Hint
样例说明
第一组输入数据,x 可以是9、18、36、72、144、288,共有6 个。
第二组输入数据,x 可以是48、1776,共有2 个。
数据规模和约定
对于 50%的数据,保证有1≤a0,a1,b0,b1≤10000 且n≤100。
对于 100%的数据,保证有1≤a0,a1,b0,b1≤2,000,000,000 且n≤2000。
C++那些细节--inline关键字
C++ inline函数简介
getchar用法
不知道怎么回事,这道题有点看不懂,先看其他的题吧
Huffuman树
Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。
2. 重复步骤1,直到{pi}中只剩下一个数。
在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:
1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。
2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。
3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。
4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。Input
输入的第一行包含一个正整数n(n<=100)。
接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
Output
输出用这些数构造Huffman树的总费用。
Examples
Input
5 5 3 8 2 9Output
59
这道题使用优先队列就可以了,从小到大排序,每次取出队列前两个数,相加之后再放入队列中(优先队列在最短路的迪杰斯特拉算法中也有使用)
以下代码:
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int> >p;
int n;
cin>>n;
for(int i=0;i<n;i++){
int m;
cin>>m;
p.push(m);
}
int sum=0;
while(!p.empty()){
int a,b,c;
a=p.top();
p.pop();
if(p.empty()){
//sum+=a;
break;
}
b=p.top();
p.pop();
c=a+b;
sum+=c;
// cout<<c<<'*'<<endl;
// cout<<sum<<'#'<<endl;
p.push(c);
}
cout<<sum<<endl;
}
JAM计数法
Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为Jam数字。在Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母。如果再规定位数为5,那么,紧接在Jam数字“bdfij”之后的数字应该是“bdghi”。(如果我们用U、V依次表示Jam数字“bdfij”与“bdghi”,则U<V< span>,且不存在Jam数字P,使U<P<V< span>)。你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。
Input
有2行,第1行为3个正整数,用一个空格隔开:
s t w
(其中s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。w为数字的位数,这3个数满足:1≤s<T≤26, 2≤w≤t-s )
第2行为具有w个小写字母的字符串,为一个符合要求的Jam数字。
所给的数据都是正确的,不必验证。Output
最多为5行,为紧接在输入的Jam数字后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。每行只输出一个Jam数字,是由w个小写字母组成的字符串,不要有多余的空格。
Examples
Input
2 10 5 bdfijOutput
bdghi bdghj bdgij bdhij befgh
对题目的解释:要求这一串字母中不能有重复的,且字母都是在给定区间内的,字母有大小之分
代码还不想写,以后补上
K好数
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。
Input
输入包含两个正整数,K和L。
Output
输出一个整数,表示答案对1000000007取模后的值。
Examples
Input
4 2Output
7Hint
数据规模与约定
对于30%的数据,KL <= 106;
对于50%的数据,K <= 16, L <= 10;
对于100%的数据,1 <= K,L <= 100。
这道题需要注意的地方:首位不能为0,接下来的一位不能比上一位大一或小一,可以为它本身
这道题我觉得只需要找出一个函数的对应关系就能求解了。先来看第一位,不能为零,有n-1中情况,
K好数
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。
Input
输入包含两个正整数,K和L。
Output
输出一个整数,表示答案对1000000007取模后的值。
Examples
Input
4 2Output
7Hint
数据规模与约定
对于30%的数据,KL <= 106;
对于50%的数据,K <= 16, L <= 10;
对于100%的数据,1 <= K,L <= 100。
这是一道动态规划的题,但是我动态规划掌握的还不太牢固
参考代码:
#include<stdio.h>
#define mod 1000000007
int main() {
int dp[110][110];
int k,l;
int i=0,j=0,m=0;
scanf("%d%d",&k,&l);
for(i=0;i<k;i++){
dp[1][i]=1;
}
for(i=2;i<=l;i++){
for(j=0;j<k;j++){
for(m=0;m<k;m++){
if(((m>j)?(m-j):(j-m))!=1){
dp[i][j]=(dp[i][j]%mod+dp[i-1][m]%mod)%mod;
}
}
}
}
int sum=0;
for(i=1;i<k;i++){
sum=(dp[l][i]%mod+sum%mod)%mod;
}
printf("%d\n",sum);
return 0;
}
九宫重排
如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。
我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
Input
输入第一行包含九宫的初态,第二行包含九宫的终态。
Output
输出最少的步数,如果不存在方案,则输出-1。
Examples
Input
12345678. 123.46758Output
3Input
13524678. 46758123.Output
22
需要注意的问题是如何记录每一种情况,还有就是如何判断这个情况出现过
解决的办法是用哈希映射