算法学习(洛谷ResseCher所给出的路线)

一、入门阶段

1.从零开始(语言基础题)(注:大致题目表述和示例不多赘述)

1)小玉买文具(模拟问题,俗称照葫芦画瓢)

班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 1元 9 角,而班主任给小玉的钱是 a 元 b 角,小玉想知道,她最多能买多少只签字笔呢。

示例:输入:10 3        输出:5

#include<stdio.h>
int main(){
    int a=19;
    
    int x,y;
    scanf("%d %d",&x,&y);
    
    int b=x*10+y;
    int sum=b/a;
    printf("%d",sum);
    return 0;
}

分析:模拟,照葫芦画瓢。时间复杂度O(1)。

2)买铅笔(模拟)

        P 老师需要去商店买 n 支铅笔作为小朋友们参加 NOIP 的礼物。她发现商店一共有 33 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P 老师决定只买同一种包装的铅笔。商店不允许将铅笔的包装拆开,因此 P 老师可能需要购买超过 n 支铅笔才够给小朋友们发礼物。现在 P 老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 n 支铅笔最少需要花费多少钱。

示例:输入:57     2 2 、50 30、 30 27        输出:54

#include<stdio.h>
int main(){
	int min=1e9,num;
	int n;
	scanf("%d",&n);
	
	int x,y;
	for(int i=1;i<=3;i++){
		scanf("%d %d",&x,&y);
		
		if(n%x!=0) num=n/x+1;
		else num=n/x;
		
		int price=num*y;
		if(price<min) min=price;
	}
	printf("%d",min);
	
	return 0; 
}

分析:模拟,照葫芦画瓢。需要注意的就是如果整除不了结果+1。时间复杂度O(N)

3)津津的储蓄计划(模拟+枚举)

#include<stdio.h>
int main(){
    int a=300,b=0,x,y;
    int cost,sum=0,min=20;
    
    for(int i=1;i<=12;i++){
        scanf("%d",&cost);
        b=a+b-cost;
        if(b>=100){
            sum=sum+(b-b%100);
            b=b%100;
    	}
    	if(b<0){
            printf("-%d",i);
            return 0;
		}
    }
    printf("%.0f",sum*1.2+b);
    return 0;
}

分析:这里要分一下几种情况,第一种就是这个月剩余的零花钱大于100时,大于100我们要把整百的数减去留下十位和个位,作为下个月的零花钱。

第二种是小于0时,那就按照题目所说输出本月的月份。

其中最重要的算法是把整百搞出来,即(b-b%100),其次就是剩余零花钱的计算。

4)不高兴的津津(模拟)

#include<stdio.h>
int main(){
    int st,ct,a,max=0,day=0;
    for(int i=1;i<8;i++){
        scanf("%d %d",&st,&ct);
        a=st+ct;
        if(a>8&&a>max){
            max=a;
            day=i;
        }
    }
    printf("%d",day);
    return 0;
}

分析:这题就是利用遍历寻找最大值,然后输出最大值所在哪天。

5)级数求和(数学)

已知,Sn=1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n}显然对于任意一个整数 k,当 n 足够大的时候,Sn​>k。

现给出一个整数 k,要求计算出一个最小的 n,使得 Sn​>k。

#include<stdio.h>
int main(){
    double s=0;
    int k,n;
    scanf("%d",&k);
    for(int n=1;s<=k;n++){
        s=s+1.0/n;
        if(s>k) break;
    }
    printf("%d",n);
    return 0;
}

分析:利用for循环来进行级数求和,并设定条件s<k,一定要在循环内设定一个条件当s>k时,跳出循环,如果不这样的话............我们举个栗子吧,当k=2时,输出n应该是4对吧,但是如果没有s>k跳出循环这个东西,我们for循环的条件s<k,在第四次执行时还s还是<k的,所以执行了第五次,循环最后输出了5。

6)计数问题(模拟+字符串)

试计算在区间 11 到 n 的所有整数中,数字 x(0≤x≤9)共出现了多少次?例如,在 1 到 11中,即在 1,2,3,4,5,6,7,8,9,10,11中,数字 11出现了 4 次。

#include<stdio.h>
int main(){
    int count=0;
    int n,x;
    scanf("%d %d",&n,&x);
    for(int i=1;i<=n;i++){
        int num=i;
		while(num>0){
            int a=num%10;
            num=num/10;
            if(x==a) count++;
        }
    }
    printf("%d",count);
    return 0;
}

分析:用for遍历,然后设计算法,利用while循环,进行移位取余,这样就可以当i为任意位数时进行逐位判断等不等于我们要的那个数。

7)cantor表(模拟+枚举)

#include<stdio.h>
int main(){
	int n,l=1,x=1,y=1;
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		if(l%2!=0){
			x--;
			y++;
			if(x==0){
				x++;
				l++;
			}
		}
		else{
			x++;
			y--;
			if(y==0){
				y++;
				l++;
			}
		} 
	}
	printf("%d/%d",x,y);
	return 0;
} 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Likin Yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值