目录
1.两面包夹芝士
题目描述
Description
给你两个长度为N的整型(int)数组A = (A1, A2, A3, …, AN) 和 B = (B1, B2, B3, …, BN)
请你找出有多少整型(int)数字x,使得∀ i∈[1,N]有Ai ≤ x ≤ Bi
Input
第一行输入N,第二行输入N个数字Ai,第三行输入N个数字Bi
1 ≤ N ≤ 100
1 ≤ Ai ≤ Bi ≤ 1000
所有输入均为int
Output
输出有多少个符合题意的x,然后换行
Sample Input
3
3 2 5
6 9 8
Sample Output
2
代码
#include<stdio.h>
int main(){
int a,b,maxa=0,minb=9999;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a);
if(a>maxa){
maxa=a;
}
}
for(int i=0;i<n;i++){
scanf("%d",&b);
if(b<minb){
minb=b;
}
}
printf("%d",minb-maxa+1);
return 0;
}
2.台阶问题(斐波那契数列)
题目描述
Description
有 N 级的台阶,你一开始在底部,每次可以向上迈最多 K 级台阶(最少 1 级),问到达第 N 级台阶有多少种不同方式。
Input
两个正整数N,K。(1 ≤ N ≤ 100000, 0 ≤ K ≤ 100)
Output
一个正整数,为不同方式数,由于答案可能很大,你需要输出 ans mod 100003 后的结果。
Sample Input
5 2
Sample Output
8
思路详解
例:当最多可以迈2级台阶时,上到第5级的最后一步为第4级迈1步,或第3级迈2步。
f[5]=f[4]+f[3]
通:当最多迈k级台阶时,上到m级台阶即为f[m]=f[m-1]+f[m-2]+......+f[m-k]
上式要满足k<m
当k>m时,f[m]=f[m-1]+f[m-2]+......f[0]
代码
#include<stdio.h>
int main(){
int n,k;
scanf("%d %d",&n,&k);
int f[n];
f[0]=1;
f[1]=1;
for(int i=2;i<=n;i++){
f[i]=0;
}
for(int i=2;i<=n;i++){
for(int j=1;i-j>=0&&j<=k;j++){//i-j<=0 此处要有等号 因为当f[0]处可以一步跨到i处 f
[0]是有意义的//
f[i]+=f[i-j];
}
}
printf("%d\n",f[n]);
}
3.排队援救
题目描述
Description
突发重大灾难,n个人陷入困境,有一个救援点需要人们排队准备接受救援,假设每个人有一个名望值,进队规则如下:
-
第一个人直接进队;
-
当队里已经有人时,新来的人发现队尾的人的名望值比自己大或者相等,他会选择离开去其他救援点;
-
队伍最多5人,如果一个人要进队时,发现队伍已满,而且他的名望值比队尾的人大,他会选择把队首的人挤掉而继续排在队尾。
问最后得到救援的人分别是谁。
Input
单组数据。
第一行为n(1 ≤ n ≤ 100),n为正整数。
第二行为n个人的名望值,第i个去排队的人的名望值为ai (1 ≤ ai ≤ 232 - 1),且为正整数。
Output
按顺序输出最后得到救援的人的号码,一个人号码是多少即为他是第几个去排队的。
Sample Input
6
1 3 5 7 9 11
Sample Output
2 3 4 5 6
代码
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int f[n];
for(int i=0;i<n;i++){
scanf("%d",&f[i]);
}
int end=0;
int a[5];
a[0]=f[0];
for(int i=1;i<n;i++){
if(end<4){
if(f[i]>a[end]){
end++;
a[end]=f[i];
printf("a[%d]=%d\n",end,a[end]);
}
}else{
if(f[i]>a[4]){
a[0]=a[1];
a[1]=a[2];
a[2]=a[3];
a[3]=a[4];
a[4]=f[i];
}
}
}
int number;
for(int k=0;k<n;k++){
for(int l=0;l<=end;l++){
if(f[k]==a[l]){
number=k+1;
printf("%d\n",number);
}
}
}
return 0;
}
4.写出这个数(数字过大)(字符转整数)
题目描述:
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
结尾无空行
输出样例:
yi san wu
代码
int main(){
char ch;
char arr[10][5]={"ling", "yi", "er", "san", "si",
"wu", "liu", "qi", "ba", "jiu"};
int sum=0,a,temp,cnt=0,i,b;
while((ch=getchar())!='\n'){
sum+=(ch-'0');
}
temp=sum;
while(temp>0){
temp/=10;
cnt++;
}
while(cnt>0){
a=pow(10,cnt-1);
b=sum/a;
sum=sum%a;
cnt--;
printf("%s",arr[b]);
if(cnt!=0){
printf(" ");
}
}
}
注意事项:
1.题目中给的数字太大啦,用int和long int都没有办法表示这个范围,所以可以采用字符数组的方式
把getchar()放在循环中
2.当把输入的整数变成字符ch时,将他转为整数(ch-'0')相当于两个字符之间的距离,就是ch表 示的数字本身
3.当我们不直接正向输出sum的每一位数,而是通过反向两次输出时,会出现的问题是
当我们的sum本身为100时,输出的应该是 1 0 0
反向一次时为1