刷刷题目集锦

目录

1.两面包夹芝士

题目描述

代码

2.台阶问题(斐波那契数列)

题目描述

思路详解

代码  

3.排队援救

题目描述

代码

4.写出这个数(数字过大)(字符转整数)

题目描述:

代码 

注意事项:


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值