1.11 循环结构实例

1.11 循环结构实例

1. 小鱼游泳

【例】有一只小鱼,它平日每天游泳 50 公里,周末休息(实行双休日),假设从周 x(1≤x≤7) 开始算起,过了 n(n≤1e6)天以后,小鱼一共累计游泳了多少公里呢?

输入格式:输入两个整数x,n(表示从周x算起,经过n天)。

输出格式:输出一个整数,表示小鱼累计游泳了多少公里。

输入样例:3 10
输出样例:400

#include<iostream>
using namespace std;

int main(){
    int x,n, ans=0; cin>>x>>n;
    for(int i=1; i<=n; i++, x++){
        if(x>7) x%=7;//如果是周八,那就回到周一
        if(x>=1 && x<=5) ans+=50;
    }
    cout<<ans;
    return 0;
} 

2. 棋盘

【例】输入三个自然数 n, i, j (1<=i, j<=N),输出在一个NxN格的棋盘中,与格子(i,j)同行、同列、同一对角线的所有格子的位置。
例如:n=4, i=2, j=3,表示在4x4棋盘中,指定位置为第2列第3行

输入样例:4 2 3
输出样例:
(2,1) (2,2) (2,3) (2,4)   //{同一行上格子的位置}
(1,3) (2,3) (3,3) (4,3)   //{同列列上格子的位置}
(1,2) (2,3) (3,4)         //{左上到右下对角线上的格子的位置}
(4,1) (3,2) (2,3) (1,4)   //{左下到右上对角线上的格子的位置}

解析:这样的题目一旦涉及到二维地图坐标,就可以考虑找下标规律,如

假设原地图的坐标是这样的:

11  12  13  14 
21  22  23  24
31  32  33  34
41  42  43  44

按照 ij 的形式书写, i表示行数,j表示列数
并且根据这样的坐标图,可以找到规律:
同一行:i相等
同一列:j相等
左上角到右下角:j-i是定值
左下角到右上角:i+j是定值

在根据这样的规律来解题:参考程序如下
    
#include<iostream>
using namespace std;

int main(){
    int n=4,x=2,y=3; cin>>n>>x>>y;
    for(int i=1; i<=n; i++){
        cout<<"("<<x<<","<<i<<") ";//同一行,行不变
    }cout<<endl;
    
    for(int i=1; i<=n; i++){
        cout<<"("<<i<<","<<y<<") ";//同一列,列不变
    }cout<<endl;

    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){//左上到右下,j-i是定值
            if(j-i==y-x) cout<<"("<<i<<","<<j<<") ";
        }
    }cout<<endl;

    for(int i=n; i>=1; i--){
        for(int j=1; j<=n; j++){//左下到右上,i+j是定值
            if(i+j==x+y) cout<<"("<<i<<","<<j<<") ";
        }
    }
    return 0;
}

3. 积木大赛

【例】春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成第i块积木的最终高度需要是hi 。
在搭建开始之前,没有任何积木(可以看成n块高度为0的积木)。接下来每次操作,小朋友们可以选择一段连续区间[L,R],然后将第L块到第R块之间(含第L块和第R块)所有积木的高度分别增加1,小M是个聪明的小朋友,她很快想出了建造大厦的最佳策略,造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。

输入格式:

输入包含两行,第1行包含一个整数n,表示大厦的宽度;
第2行包含n个整数,第i个整数为hi。

输出格式:

输出仅1行,即建造所需的最少操作数。

输入样例

5
2 3 4 1 2

输出样例:5

说明:其中一种可行方案[1,5] [1,3] [2,3] [3,3] [5,5]

数据范围: 1<=n<=100000, 0<=hi<=10000

解析:这道题目需要仔细读题,认真分析,找到问题的关键之处。

当 h[i+1] > h[i] 时,结果应该新增 h[i+1]-h[i]

当 h[i+1] <= h[i] 时,不用操作

image

#include<iostream>
using namespace std;

int main(){
    int n; cin>>n;
    int ans=0,h=0;
    for(int i=1; i<=n; i++){
        int a; cin>>a;
        if(a>h) ans += a-h;
        h=a;
    }
    cout<<ans;
    return 0;
}
posted @ 2021-08-18 15:02  HelloHeBin  阅读(688)  评论(0编辑  收藏  举报