2025-4-15-C++ 学习 循环结构(3)

2025-4-15-C++ 学习 循环结构(3)

  循环结构,继续,结构可能会更复杂的一些。

P1423 小玉在游泳

题目描述

小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 2 2 2 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98 % 98\% 98%。现在小玉想知道,如果要游到距离 s s s 米的地方,她需要游多少步呢。请你编程解决这个问题。

输入格式

输入一个实数 s s s(单位:米),表示要游的目标距离。

输出格式

输出一个整数,表示小玉一共需要游多少步。

输入输出样例 #1

输入 #1

4.3

输出 #1

3

说明/提示

数据保证, 0 ≤ s < 100 0 \leq s < 100 0s<100,且 s s s 小数点后最多只有一位。

题解代码

  读懂题意,别着急。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    double s;
    cin >> s;
    int k = 0;
    double s_up = 0.0;
    double tmp = 2.0;
    while (s_up < s)
        {
            s_up += tmp;
            tmp *= 0.98;
            k++;
        }
    cout << k;
    return 0;
}

P1307 [NOIP 2011 普及组] 数字反转

题目描述

给定一个整数 N N N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。

输入格式

一个整数 N N N

输出格式

一个整数,表示反转后的新数。

输入输出样例 #1

输入 #1

123

输出 #1

321

输入输出样例 #2

输入 #2

-380

输出 #2

-83

说明/提示

【数据范围】

$-1,000,000,000\leq N\leq 1,000,000,000 $。

noip2011 普及组第一题

题解代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    int flag = 0;
    cin >> n;
    int ans = 0;
    if(n < 0) 
    {
        n = -n;
        flag = 1;
    }
        
    while(n>0)
        {
            ans = ans * 10 + (n % 10); 
            n /= 10;
        }
    
    if(flag)
    {
        cout << -1 * ans << endl;
    }
    else
    {
        cout << ans << endl;
    }
    return 0;
}

P1720 月落乌啼算钱(斐波那契数列)

题目背景

(本道题目木有隐藏歌曲……不用猜了……)

《爱与愁的故事第一弹·heartache》最终章。

吃完 pizza,月落乌啼知道超出自己的预算了。为了不在爱与愁大神面前献丑,只好还是硬着头皮去算钱……

题目描述

算完钱后,月落乌啼想着:“你坑我!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第 n n n 样菜价格多少?”月落乌啼写出了:

F n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{5}} Fn=5 (21+5 )n(215 )n

由于爱与愁大神学过编程,于是就用 1 1 1 分钟的时间求出了 F n F_n Fn 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 F n F_n Fn 的值吗?

输入格式

一行一个自然数 n n n

输出格式

只有 1 1 1 行一个实数 F n F_n Fn,保留两位小数。

输入输出样例 #1

输入 #1

6

输出 #1

8.00

说明/提示

对于所有数据: 0 ≤ n ≤ 48 0 \leq n\leq 48 0n48

题解代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    double f[48];
    f[0] = 0;
    f[1] = 1;
    f[2] = 1;
    for(int k1=2;k1<=n;++k1)
        {
            f[k1] = f[k1-1] + f[k1-2];
        }
    cout << fixed << setprecision(2) << f[n] << endl;
    return 0;
}

P5724 【深基4.习5】求极差 / 最大跨度值 / 最大值和最小值的差

题目描述

给出 n n n n n n 个整数 a i a_i ai,求这 n n n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。

输入格式

第一行输入一个正整数 n n n,表示整数个数。

第二行输入 n n n 个整数 a 1 , a 2 … a n a_1,a_2 \dots a_n a1,a2an,以空格隔开。

输出格式

输出一个整数,表示这 n n n 个整数的极差。

输入输出样例 #1

输入 #1

6
4 1 5 1 4 1

输出 #1

4

说明/提示

数据保证, 1 ≤ n ≤ 100 1 \leq n\leq 100 1n100 0 ≤ a i ≤ 1000 0\le a_i \le 1000 0ai1000

题解代码

  记住分配数组的大小时,要注意给一个固定的常数。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    // 数组分配一定要注意,不要给未知数。
    int a[100];
    cin >> n;
    int n_mx,n_mi;
    for(int k1=0;k1<n;++k1)
        {
            cin >> a[k1];
            if(k1 == 0)
            {
                n_mx = n_mi = a[k1];
            }
            else
            {
                if(a[k1] > n_mx) n_mx = a[k1];
                if(a[k1] < n_mi) n_mi = a[k1];
            }
        }
    cout << n_mx-n_mi << endl;
    return 0;
}

P1420 最长连号

题目描述

输入长度为 n n n 的一个正整数序列,要求输出序列中最长连号的长度。

连号指在序列中,从小到大的连续自然数。

输入格式

第一行,一个整数 n n n

第二行, n n n 个整数 a i a_i ai,之间用空格隔开。

输出格式

一个数,最长连号的个数。

输入输出样例 #1

输入 #1

10
1 5 6 2 3 4 5 6 8 9

输出 #1

5

说明/提示

数据规模与约定

对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 4 1 \leq n \leq 10^4 1n104 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109

题解代码

方法一:很不错的 for 循环灵活运用

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int a[10001];
    for(int k1=0;k1<n;++k1)
        {
            cin >> a[k1];
        }
    int idx = 0;
    int ans = 1;
    int tmp = 1;
    for(int k1 = idx;k1<n;++k1)
        {
            if(a[k1+1] == a[k1] + 1) tmp++;
            if(tmp > ans) ans = tmp;
            if(a[k1+1] != a[k1] + 1)
            {
                idx++;
                tmp = 1;
            }
        }
    cout << ans <<endl;
    return 0;
}

方法二: 动态规划,挺难想的,还是觉得

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a[n+1],dp[n+1];
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	int maxn=0;
	for(int i=n;i>0;i--)
	{
		if(i==n)
		{
			dp[i]=1;
		}
		else
		{
			if(a[i+1]-1==a[i])
			{
				dp[i]=dp[i+1]+1;
			}
			else
			{
				dp[i]=1;
			}
		}
		maxn=max(dp[i],maxn);
	}
	cout<<maxn;
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值