Java教程

寒假每日一题(七)

本文主要是介绍寒假每日一题(七),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 一、拼写正确
  • 二、 Z字形扫描
  • 三、 画图
  • 四、最大波动
  • 五、折点计数
  • 六、跳一跳
  • 总结


一、拼写正确

题目链接
给定一个非负整数 N,你的任务是计算 N 的所有数字的总和,并以英语输出总和的每个数字。

输入格式
共一行,包含一个整数 N。

输出格式
共一行,用英语输出总和的每个数字,单词之间用空格隔开。

数据范围
0≤N≤10100
输入样例:
12345
输出样例:
one five

这里有个特别的用法就是to_string,前置条件就是string这个头文件当中,其功能:将数字常量转换为字符串

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
    string num;
    cin>>num;
    int sum=0;
    for(auto c:num)
        sum+=c-'0';
    string str=to_string(sum);
    string name[]={
    "zero","one","two","three","four","five"
,"six" ,"seven","eight","nine"   };
for(auto c:str)
    cout<<name[c-'0']<<" ";
    return 0;
}

二、 Z字形扫描

在图像编码的算法中,需要将一个给定的方形矩阵进行 Z 字形扫描(Zigzag Scan)。

给定一个 n×n 的矩阵,Z 字形扫描的过程如下图所示:
在这里插入图片描述

对于下面的 4×4 的矩阵,

1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
对其进行 Z 字形扫描后得到长度为 16 的序列:1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3。

请实现一个 Z 字形扫描的程序,给定一个 n×n 的矩阵,输出对这个矩阵进行 Z 字形扫描的结果。

输入格式
输入的第一行包含一个整数 n,表示矩阵的大小。

输入的第二行到第 n+1 行每行包含 n 个正整数,由空格分隔,表示给定的矩阵。

输出格式
输出一行,包含 n×n 个整数,由空格分隔,表示输入的矩阵经过 Z 字形扫描后的结果。

数据范围
1≤n≤500,
矩阵元素为不超过 1000 的正整数。

输入样例:
4
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
输出样例:
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3

找规律,可以用偏移量,也可以不用偏移量
奇数行从上往下,偶数行从下往上

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=510;
int n;
int a[N][N];

int main()
{
    scanf("%d",&n);//当数据大到一定的程度的时候,
    //就用scanf来读,这样子效率就会高很多
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        scanf("%d",&a[i][j]);
    for(int i=2;i<=n*2;i++)
    {
        if(i%2)//就是偶数行
        {
            for(int j=1;j<i;j++)
                if(j>=1&&j<=n&&i-j>=1&&i-j<=n)
                printf("%d ",a[j][i-j]);
        }
        else //奇数行就是反着来
            {
                    for(int j=i-1;j;j--)
                if(j>=1&&j<=n&&i-j>=1&&i-j<=n)
                printf("%d ",a[j][i-j]);
        }
      //  puts("");//这个的功能可输出换行
    }
    return 0;
}

 

 

三、 画图

题目链接

在一个定义了直角坐标系的纸上,画一个 (x1,y1) 到 (x2,y2) 的矩形指将横坐标范围从 x1 到 x2,纵坐标范围从 y1 到 y2 之间的区域涂上颜色。

下图给出了一个画了两个矩形的例子。

第一个矩形是 (1,1) 到 (4,4),用绿色和紫色表示。

第二个矩形是 (2,3) 到 (6,5),用蓝色和紫色表示。

图中,一共有 15 个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。

在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。

p21.png

给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。

输入格式
输入的第一行包含一个整数 n,表示要画的矩形的个数。

接下来 n 行,每行 4 个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。

输出格式
输出一个整数,表示有多少个单位的面积被涂上颜色。

数据范围
1≤n≤100,
0≤ 横坐标、纵坐标 ≤100
输入样例:
2
1 1 4 4
2 3 6 5
输出样例:
15

求矩形并集的面积,可以开bool的二维数组,定义一下左下角点的坐标,即格子的坐标

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=110;
int n,m;
bool st[N][N];

int main()
{
    cin>>n;
    while(n--)
    {
        int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        for(int i=x1;i<x2;i++)
            for(int j=y1;j<y2;j++)
            st[i][j]=true;
    }
    int res=0;
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
        res+=st[i][j];
    cout<<res<<endl;//可以利用bool类型的跟int类型互换
    return 0;
}


四、最大波动

题目链接
小明正在利用股票的波动程度来研究股票。

小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。

输入格式
输入的第一行包含了一个整数 n,表示小明拿到的收盘价格的连续天数。

第二行包含 n 个正整数,依次表示每天的收盘价格。

输出格式
输出一个整数,表示这只股票这 n 天中的最大波动值。

数据范围
对于所有评测用例,2≤n≤1000。
股票每一天的价格为 1 到 10000 之间的整数。

输入样例:
6
2 5 5 7 3 5
输出样例:
4
样例解释
第四天和第五天之间的波动最大,波动值为 |3−7|=4。

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=1010;

int n;
int q[N];

int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>q[i];
    int res=0;
    for(int i=1;i<n;i++)
        res=max(res,abs(q[i]-q[i-1]));
   cout<<res<<endl;
    return 0;
}


五、折点计数

题目链接

给定 n 个整数表示一个商店连续 n 天的销售量。

如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点。

其他的天都不是折点。

如下图中,第 3 天和第 6 天是折点。

p1.png

给定 n 个整数 a1,a2,…,an 表示销售量,请计算出这些天总共有多少个折点。

为了减少歧义,我们给定的数据保证:在这 n 天中相邻两天的销售量总是不同的,即 ai−1≠ai。

注意,如果两天不相邻,销售量可能相同。

输入格式
输入的第一行包含一个整数 n。

第二行包含 n 个整数,用空格分隔,分别表示 a1,a2,…,an。

输出格式
输出一个整数,表示折点出现的数量。

数据范围
所有评测用例满足:1≤n≤1000,每天的销售量是不超过 10000 的非负整数。

输入样例:
7
5 4 1 2 3 6 4
输出样例:
2

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=1010;

int n;
int q[N];

int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>q[i];
    int res=0;
    for(int i=1;i<n-1;i++)
    {
        int a=q[i-1],b=q[i],c=q[i+1];
        if(b<a&&b<c||b>a&&b>c)
            res++;
    }
    cout<<res<<endl;
    return 0;
}


六、跳一跳

题目链接
近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱。

简化后的跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束。

如果跳到了方块上,但没有跳到方块的中心则获得 1 分;跳到方块中心时,若上一次的得分为 1 分或这是本局游戏的第一次跳跃则此次得分为 2 分,否则此次得分比上一次得分多两分(即连续跳到方块中心时,总得分将 +2,+4,+6,+8…)。

现在给出一个人跳一跳的全过程,请你求出他本局游戏的得分(按照题目描述的规则)。

输入格式
输入包含多个数字,用空格分隔,每个数字都是 1,2,0 之一,1 表示此次跳跃跳到了方块上但是没有跳到中心,2 表示此次跳跃跳到了方块上并且跳到了方块中心,0 表示此次跳跃没有跳到方块上(此时游戏结束)。

输出格式
输出一个整数,为本局游戏的得分(在本题的规则下)。

数据范围
对于所有评测用例,输入的数字不超过 30 个,保证 0 正好出现一次且为最后一个数字。

输入样例:
1 1 2 2 2 1 1 2 2 0
输出样例:
22

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;



int main()
{
  int res=0,score=0,x;
  while(cin>>x,x)
      if(x==1)res++,score=0;
      else score+=2,res+=score;
      cout<<res<<endl;
  
    return 0;
}



总结

要学会每一道题的知识点,而不是背题,也不是为了做题而做题,而且这一期都是基础题。。。

这篇关于寒假每日一题(七)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!