一、入门阶段
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)级数求和(数学)
已知,显然对于任意一个整数 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;
}