【入门3】循环结构 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1.
题目描述
给出 n 和 n 个整数 ai,求这 n 个整数中最小值是什么。
输入格式
第一行输入一个正整数 n,表示数字个数。
第二行输入 n 个非负整数,表示 1,2…a1,a2…an,以空格隔开。
输出格式
输出一个非负整数,表示这 n 个非负整数中的最小值。
输入输出样例
输入 #1
8 1 9 2 6 0 8 1 7
输出 #1
0
说明/提示
数据保证,n≤100 且 0≤ai≤1000。
#include<stdio.h>
int main()
{
int n,x,min=1000;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
if(x<min)
min=x;
}
printf("%d",min);
return 0;
}
时间复杂度O(n),空间复杂度O(1)
2.
题目描述
给定 n 和 k,将从 1 到 n 之间的所有正整数可以分为两类:A 类数可以被 k 整除(也就是说是 k 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 位,用空格隔开。
数据保证两类数的个数都不会是 0。
输入格式
输入两个正整数 n 与 k。
输出格式
输出一行,两个实数,分别表示 A 类数与 B 类数的平均数。精确到小数点后一位。
输入输出样例
输入 #1
100 16
输出 #1
56.0 50.1
说明/提示
数据保证,1≤n≤10000,1≤k≤100。
判断能不能被k整除再分别求和和求平均就行了。
#include<stdio.h>
int main()
{
int n,k,suma=0,sumb=0,kn=0;
float ansa,ansb;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
if(i%k)
suma+=i;
else
{
sumb+=i;
kn++;
}
}
ansb=sumb*1.0/kn;
ansa=suma*1.0/(n-kn);
printf("%.1f %.1f",ansb,ansa);
return 0;
}
时间复杂度O(n),空间复杂度O(1)
3.
题目描述
《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a 的木棍,从第二天开始,每天都要将这根木棍锯掉一半(每次除 2,向下取整)。第几天的时候木棍的长度会变为 1?
输入格式
输入一个正整数 a,表示木棍长度。
输出格式
输出一个正整数,表示要第几天的时候木棍长度会变为 1。
输入输出样例
输入 #1
100
输出 #1
7
说明/提示
数据保证,1≤a≤10^9。
#include<stdio.h>
int main()
{
int a,i;
scanf("%d",&a);
for(i=1;a!=1;i++)
a/=2;
printf("%d",i);
return 0;
}
时间复杂度O(logn),空间复杂度O(1)
4.
题目描述
给出 n,请输出一个直角边长度是 n 的数字直角三角形。所有数字都是 2 位组成的,如果没有 2 位则加上前导 0。
输入格式
输入一个正整数 n。
输出格式
输出如题目要求的数字直角三角形。
输入输出样例
输入 #1
5
输出 #1
0102030405 06070809 101112 1314 15
说明/提示
数据保证,1≤n≤13。
#include<stdio.h>
int main()
{
int n,k=1;
scanf("%d",&n);
for(int i=n;i>0;i--)
{
if(n-i)
printf("\n");
for(int j=i;j>0;j--)
{
printf("%02d",k);
k++;
}
}
return 0;
}
时间复杂度O(n),空间复杂度O(1)
5.
题目描述
用高精度计算出 S=1!+2!+3!+⋯+n!(n≤50)。
其中 !
表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
输入输出样例
输入 #1
3
输出 #1
9
说明/提示
【数据范围】
对于 100% 的数据,1≤n≤50。
【其他说明】
注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n≤20,使用书中的代码无法通过本题。
如果希望通过本题,请继续学习第八章高精度的知识。
NOIP1998 普及组 第二题
神奇的高精度计算,其实只是最基础的算法。用一个数组代替计算数进行加减乘除的位运算以满足数据类型不够大时的需求。
#include<stdio.h>
#define N 3000
int main()
{
int arr[N] = {1};
int sum[N] = {0};
int digitsarr = 1;
int digitssum = 1;
int jw = 0;//进位
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < digitsarr; j++)
{
arr[j] = i * arr[j] + jw;
jw = arr[j] / 10;
arr[j] %= 10;
if (j == digitsarr - 1 && jw)
digitsarr++;
}
for (int j = 0; j < digitssum; j++)
{
sum[j] = sum[j]+ arr[j] + jw;
jw = sum[j] / 10;
sum[j] %= 10;
if (digitssum < digitsarr)
digitssum = digitsarr;
if (j == digitssum - 1 && jw)
digitssum++;
}
}
for (int j = digitssum-1; j >=0; j--)
printf("%d", sum[j]);
return 0;
}
时间复杂度O(n),空间复杂度O(n)
6.
题目背景
NOIP2013 普及组 T1
题目描述
试计算在区间 1 到 n 的所有整数中,数字 x(0≤x≤9)共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。
输入格式
2 个整数 n,x,之间用一个空格隔开。
输出格式
1 个整数,表示 x 出现的次数。
输入输出样例
输入 #1
11 1
输出 #1
4
说明/提示
对于 100% 的数据,1≤n≤10^6,0≤x≤9。
把每个数拆开判断即可
#include<stdio.h>
int main()
{
int n,k,sign=0,digits;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
digits=i;
for(int j=0;;j++)
{
if((digits%10)==k)
sign++;
digits/=10;
if(digits==0)
break;
}
}
printf("%d",sign);
return 0;
}
时间复杂度O(n^2),空间复杂度O(1)
7.
题目描述
已知:Sn=1+1/2+1/3+…+1/n。显然对于任意一个整数 k,当 n 足够大的时候,Sn>k。
现给出一个整数 k,要求计算出一个最小的 n,使得 Sn>k。
输入格式
一个正整数 k。
输出格式
一个正整数 n。
输入输出样例
输入 #1
1
输出 #1
2
说明/提示
【数据范围】
对于 100% 的数据,1≤k≤15。
【题目来源】
NOIP 2002 普及组第一题
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double sum=0;
for(int i=1;;i++)
{
sum+=1.0/i;
if(sum>n)
{
printf("%d",i);
break;
}
}
return 0;
}
时间复杂度不会,空间复杂度O(1)
8.
题目背景
NOIP2015 普及组 T1
题目描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 n 天每天收到 n 枚金币后,骑士会在之后的连续 n+1 天里,每天收到 n+1 枚金币。
请计算在前 k 天里,骑士一共获得了多少金币。
输入格式
一个正整数 k,表示发放金币的天数。
输出格式
一个正整数,即骑士收到的金币数。
输入输出样例
输入 #1
6
输出 #1
14
输入 #2
1000
输出 #2
29820
说明/提示
【样例 1 说明】
骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 1+2+2+3+3+3=14 枚金币。
对于 100% 的数据,1≤k≤10^4。
在for循环中加入另一个计算金币数量的计数器就行
#include<stdio.h>
int main()
{
int n,sum=0,sign=0,i=1;
scanf("%d",&n);
for(int j=1;j<=n;j++)
{
sum+=i;
sign++;
if(sign==i)
{
i++;
sign=0;
}
}
printf("%d",sum);
return 0;
}
时间复杂度O(n),空间复杂度O(1)
9.
题目描述
计算1+2+3+⋯+(n−1)+n 的值,其中正整数 n 不大于 100。由于你没有高斯聪明,所以你不被允许使用等差数列求和公式直接求出答案。
输入格式
输入一个正整数 n。
输出格式
输出一个正整数,表示最后求和的答案。
输入输出样例
输入 #1
100
输出 #1
5050
说明/提示
数据保证,1≤n≤100。
#include<stdio.h>
int main()
{
int n,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
sum+=i;
printf("%d",sum);
return 0;
}
时间复杂度O(n),空间复杂度O(1)
10.
题目描述
小 A 有一个质数口袋,里面可以装各个质数。他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。
口袋的负载量就是口袋里的所有数字之和。
但是口袋的承重量有限,装的质数的和不能超过 L。给出L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数的个数,数字之间用换行隔开。
输入格式
一行一个正整数 L。
输出格式
将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。
输入输出样例
输入 #1
100
输出 #1
2 3 5 7 11 13 17 19 23 9
输入 #2
5
输出 #2
2 3 2
输入 #3
11
输出 #3
2 3 5 3
说明/提示
数据保证,1≤L≤10^5。
先判断质数再求和
#include<stdio.h>
int main()
{
int sum = 0, k, n = 0;
scanf("%d", &k);
for (int i = 2;; i++)
{
int sign = 0;
for (int j = 1; j <= i / 2; j++)
{
if (((i % j)==0)&&(j!=1))
sign = 1;
}
if (sign == 0)
{
sum += i;
if (sum > k)
{
if (n)
printf("\n");
printf("%d", n);
break;
}
n++;
if (n - 1)
printf("\n");
printf("%d", i);
}
}
return 0;
}
时间复杂度O(n),空间复杂度O(1)
11.
题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)(一亿)间的所有回文质数。
输入格式
第一行输入两个正整数 a 和 b。
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入 #1
5 500
输出 #1
5 7 11 101 131 151 181 191 313 353 373 383
说明/提示
Hint 1: Generate the palindromes and see if they are prime.
提示 1: 找出所有的回文数再判断它们是不是质数(素数).
Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
题目翻译来自NOCOW。
USACO Training Section 1.5
产生长度为 5 的回文数:
for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
for (d2 = 0; d2 <= 9; d2++) {
for (d3 = 0; d3 <= 9; d3++) {
palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
}
}
}
难麻了。首先生成回文数,再判断是不是指数。因为数字很大所以要尽量简化,发现四位六位八位都不满足质数,直接去掉了这三位的判断。先判断a,b位数再生成回文数,最后判断质数。用了很蠢的生成回文数的算法,最后把判断质数的条件改成 j * j <= n过了,本来是j<n/2,警钟长鸣。
#include<stdio.h>
int prinum(int n)
{
for (int j = 3; j * j <= n; j++)
{
if ((n % j) == 0)
{
return 0;
}
}
return 1;
}
int digit(int n)
{
int i;
for (i = 0; n != 0; i++)
{
n /= 10;
}
return i;
}
int main()
{
int a,b,sign=0;
scanf("%d %d", &a, &b);
int d1, d2, d3, d4, k,l1=1,l2=0,l3=0,l4=0,u1=9,u2=9,u3=9,u4=9,lena,lenb;
lena = digit(a);
lenb = digit(b);
switch (lena)
{
case 3:goto decision3;
case 5:case 4:goto decision5;
case 7:case 6:goto decision7;
case 8:goto end;
}
if ((a <= 5) && (b >= 5))
{
if (sign)
printf("\n");
else
sign = 1;
printf("5");
}
if ((a <= 7) && (b >= 7))
{
if (sign)
printf("\n");
else
sign = 1;
printf("7");
}
if ((a <= 11) && (b >= 11))
{
if (sign)
printf("\n");
else
sign = 1;
printf("11");
}
if ((lenb == 2) && (lenb) == 1)
goto end;
decision3:
for (d1 = l1; d1 <= u1; d1 += 2)
{
for (d2 = l2; d2 <= u2; d2++)
{
k = 100 * d1 + 10 * d2 + d1;
if (prinum(k) && (k >= a) && (k <= b))
{
if (sign)
printf("\n");
else
sign = 1;
printf("%d", k);
}
}
}
decision5:
if ((lenb == 3) || (lenb == 4))
goto end;
for (d1 = 1; d1 <= 9; d1 += 2)
{
for (d2 = 0; d2 <= 9; d2++)
{
for (d3 = 0; d3 <= 9; d3++)
{
k = 10000 * d1 + 1000 * d2 + 100 * d3 + 10 * d2 + d1;
if (prinum(k) && (k >= a) && (k <= b))
{
if (sign)
printf("\n");
else
sign = 1;
printf("%d", k);
}
}
}
}
decision7:
if ((lenb == 5) || (lenb == 6))
goto end;
for (d1 = 1; d1 <= 9; d1 += 2)
{
for (d2 = 0; d2 <= 9; d2++)
{
for (d3 = 0; d3 <= 9; d3++)
{
for (d4 = 0; d4 <= 9; d4++)
{
k = 1000000 * d1 + 100000 * d2 + 10000 * d3 + 1000 * d4 + 100 * d3 + 10 * d2 + d1;
if (prinum(k) && (k >= a) && (k <= b))
{
if (sign)
printf("\n");
else
sign = 1;
printf("%d", k);
}
}
}
}
}
end:
return 0;
}
时间复杂度O(n),空间复杂度O(1)
12.
题目描述
小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 2 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98%。现在小玉想知道,如果要游到距离 s 米的地方,她需要游多少步呢。请你编程解决这个问题。
输入格式
输入一个实数 s(单位:米),表示要游的目标距离。
输出格式
输出一个整数,表示小玉一共需要游多少步。
输入输出样例
输入 #1
4.3
输出 #1
3
说明/提示
数据保证,0≤s<100,且 s 小数点后最多只有一位。
#include<stdio.h>
int main()
{
float n,step=2;
int i=0;
scanf("%f",&n);
while(n>0)
{
n-=step;
step*=0.98;
i++;
}
printf("%d",i);
return 0;
}
时间复杂度O(n),空间复杂度O(1)
13.
题目描述
给定一个整数 N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。
输入格式
一个整数 N。
输出格式
一个整数,表示反转后的新数。
输入输出样例
输入 #1
123
输出 #1
321
输入 #2
-380
输出 #2
-83
说明/提示
【数据范围】
−1,000,000,000≤N≤1,000,000,000。
noip2011 普及组第一题
把负号和零单独取出来就行。
#include<stdio.h>
int main()
{
int n,sign=1;
scanf("%d",&n);
if(n<0)
{
n=-n;
printf("-");
}
if(n==0)
printf("0");
else
{
while(n>0)
{
if(n%10)
sign=0;
if(((n%10)==0)&&sign);
else
printf("%d",n%10);
n/=10;
}
}
return 0;
}
时间复杂度O(n),空间复杂度O(1)
14.
题目背景
(本道题目木有隐藏歌曲……不用猜了……)
《爱与愁的故事第一弹·heartache》最终章。
吃完 pizza,月落乌啼知道超出自己的预算了。为了不在爱与愁大神面前献丑,只好还是硬着头皮去算钱……
题目描述
算完钱后,月落乌啼想着:“你坑我!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第 n 样菜价格多少?”月落乌啼写出了:
计算式写不出来,看题吧
由于爱与愁大神学过编程,于是就用 1 分钟的时间求出了 Fn 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 Fn 的值吗?
输入格式
一行一个自然数 n。
输出格式
只有 1 行一个实数 Fn,保留两位小数。
输入输出样例
输入 #1
6
输出 #1
8.00
说明/提示
对于所有数据:0≤n≤48。
#include<stdio.h>
#include<math.h>
int main()
{
int n;
double sqr5=sqrt(5),sum1=1,sum2=1;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
sum1*=(1+sqr5)/2;
sum2*=(1-sqr5)/2;
}
sum1-=sum2;
sum1/=sqr5;
printf("%.2f",sum1);
return 0;
}
时间复杂度O(n),空间复杂度O(1)
15.
题目描述
给出 n 和 n 个整数 ai,求这 n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。
输入格式
第一行输入一个正整数 n,表示整数个数。
第二行输入 n 个整数 a1,a2…an,以空格隔开。
输出格式
输出一个整数,表示这 n 个整数的极差。
输入输出样例
输入 #1
6 4 1 5 1 4 1
输出 #1
4
说明/提示
数据保证,1≤n≤100,0≤ai≤1000。
求出最大最小值做差
#include<stdio.h>
int main()
{
int max,min,n,k;
scanf("%d",&n);
scanf("%d",&max);
min=max;
for(int i=1;i<n;i++)
{
scanf("%d",&k);
if(k>max)
max=k;
if(k<min)
min=k;
}
printf("%d",max-min);
return 0;
}
时间复杂度O(n),空间复杂度O(1)
16.
题目描述
输入长度为 n 的一个正整数序列,要求输出序列中最长连号的长度。
连号指在序列中,从小到大的连续自然数。
输入格式
第一行,一个整数 n。
第二行,n 个整数 ai,之间用空格隔开。
输出格式
一个数,最长连号的个数。
输入输出样例
输入 #1
10 1 5 6 2 3 4 5 6 8 9
输出 #1
5
说明/提示
数据规模与约定
对于 100%100% 的数据,保证 1≤n≤10^4,1≤ai≤10^9。
写一个计数器,是连号加一,不是归零
#include<stdio.h>
int main()
{
int n,k,s,sign=1,max=1;
scanf("%d",&n);
scanf("%d",&k);
for(int i=1;i<n;i++)
{
scanf("%d",&s);
if(s==k+1)
{
sign++;
if(sign>max)
max=sign;
}
else
{
sign=1;
}
k=s;
}
printf("%d",max);
return 0;
}
时间复杂度O(n),空间复杂度O(1)
17.
题目描述
已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
输入一个正整数 n。
输出格式
输出一个正整数 p,即较大的那个质数。
输入输出样例
输入 #1
21
输出 #1
7
说明/提示
1≤n≤2×10^9
NOIP 2012 普及组 第一题
求小的再除出来大的,比直接求大的少算一点应该吧
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
for(int i=2;i<sqrt(n);i++)
{
if((n%i)==0)
{
printf("%d",n/i);
}
}
return 0;
}
时间复杂度O(n),空间复杂度O(1)
18.
题目描述
模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。
输入格式
输入矩阵的规模,不超过 9。
输出格式
输出矩形和正方形
输入输出样例
输入 #1
4
输出 #1
01020304 05060708 09101112 13141516 01 0203 040506 07080910
#include<stdio.h>
int main()
{
int n,k=1;
scanf("%d",&n);
for(int i=0;i<n*n;i++)
{
if(i&&((i%n)==0))
printf("\n");
printf("%02d",i+1);
}
printf("\n");
for(int i=0;i<n;i++)
{
printf("\n");
for(int j=0;j<n-i-1;j++)
{
printf(" ");
}
for(int j=0;j<i+1;j++)
{
printf("%02d",k);
k++;
}
}
return 0;
}
时间复杂度O(n^2),空间复杂度O(1)
19.
题目描述
现在有 n(n≤1000) 位评委给选手打分,分值从 0 到 10。需要去掉一个最高分,去掉一个最低分(如果有多个最高或者最低分,也只需要去掉一个),剩下的评分的平均数就是这位选手的得分。现在输入评委人数和他们的打分,请输出选手的最后得分,精确到 2 位小数。
输入格式
第一行输入一个正整数 n,表示有 n 个评委。
第二行输入 n 个正整数,第 i 个正整数表示第 i 个评委打出的分值。
输出格式
输出一行一个两位小数,表示选手的最后得分。
输入输出样例
输入 #1
5 9 5 6 8 9
输出 #1
7.67
说明/提示
数据保证,3≤n≤1000,每个评委打出的分值为为 0 到 10(含 0 与 10)之间的整数。
把每个分数的票统计出来就行
#include<stdio.h>
int main()
{
int n, score;
float sum = 0;
int arr[11] = { 0 };
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &score);
arr[score]++;
}
for (int i = 0; i < 11; i++)
{
if (arr[i] != 0)
{
arr[i]--;
break;
}
}
for (int i = 10; i >= 0; i--)
{
if (arr[i] != 0)
{
arr[i]--;
break;
}
}
for (int i = 0; i < 11; i++)
{
arr[i] *= i;
sum += arr[i];
}
sum = sum * 1.0 / ( n - 2);
printf("%.2f", sum);
return 0;
}
时间复杂度O(n),空间复杂度O(1)
20.
题目描述
After successfully conquering the South Pole, Davor is preparing for new challenges. Next up is the Arctic expedition to Siberia, Greenland and Norway. He begins his travels on 31 December 2018, and needs to collect N kunas (Croatian currency) by then. In order to do this, he has decided to put away X (X ≤ 100) kunas every Monday to his travel fund, X + K kunas every Tuesday, X + 2* K every Wednesday, and so on until Sunday, when he will put away X + 6* K kunas. This way, he will collect money for 52 weeks, starting with 1 January 2018 (Monday) until 30 December 2018 (Sunday).
If we know the amount of money N, output the values X and K so that it is possible to collect the exact money amount in the given timespan. The solution will always exist, and if there are multiple, output the one with the greatest X and smallest K .
输入格式
The first line of input contains the integer N (1456 ≤ N ≤ 145600), the number from the task.
输出格式
The first line of output must contain the value of X (0 < X ≤ 100 ), and the second the value of K (K > 0 ).
题意翻译
在征服南极之后,Davor 开始了一项新的挑战。下一步是在西伯利亚、格林兰、挪威的北极圈远征。他将在 2018 年 12 月 31 日开始出发,在这之前需要一共筹集 n 元钱。他打算在每个星期一筹集 x 元,星期二筹集 x+k 元,……,星期日筹集 x+6k 元,并连续筹集 52 个星期。其中 x,k 为正整数,并且满足 1≤x≤100。
现在请你帮忙计算 x,k 为多少时,能刚好筹集 n 元。
如果有多个答案,输出 x 尽可能大,k 尽可能小的。注意 k 必须大于 0。
输入输出样例
输入 #1
1456
输出 #1
1 1
输入 #2
6188
输出 #2
14 1
输入 #3
40404
输出 #3
99 4
#include<stdio.h>
int main()
{
int N;
scanf("%d",&N);
N/=52;
for(int k=1;k<=N;k++)
{
if(((N-21*k)/7<=100)&&(((N-21*k)%7)==0))
{
printf("%d\n%d",(N-21*k)/7,k);
break;
}
}
return 0;
}
时间复杂度O(n),空间复杂度O(1)
21.
题目描述
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20% 还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100 元或恰好 100 元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有 83 元,妈妈给了津津 300 元。津津预计11月的花销是 180 元,那么她就会在妈妈那里存 200 元,自己留下 183 元。到了 11 月月末,津津手中会剩下 3 元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据 2004 年 11 月到 12 月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到 2004 年年末,妈妈将津津平常存的钱加上 20% 还给津津之后,津津手中会有多少钱。
输入格式
12 行数据,每行包含一个小于350 的非负整数,分别表示 11 月到 12 月津津的预算。
输出格式
一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 −X,X 表示出现这种情况的第一个月;否则输出到 2004 年年末津津手中会有多少钱。
注意,洛谷不需要进行文件输入输出,而是标准输入输出。
输入输出样例
输入 #1
290 230 280 200 300 170 340 50 90 80 200 60
输出 #1
-7
输入 #2
290 230 280 200 300 170 330 50 90 80 200 60
输出 #2
1580
按题意先求每个月剩多少,再减去存钱,最后把存的钱加百分之二十求和就行。
#include<stdio.h>
int main()
{
int sum=0,saving=0,n,sign=1;
for(int i=1;i<=12;i++)
{
sum+=300;
scanf("%d",&n);
sum-=n;
if(sum<0)
{
printf("-%d",i);
sign=0;
break;
}
if(sum/100)
{
saving+=(sum/100)*100;
sum%=100;
}
}
if(sign)
printf("%d",sum+12*saving/10);
return 0;
}
时间复杂度O(1),空间复杂度O(1)