学习总结13

# 最大正方形

## 题目描述

在一个 n* m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形,输出边长。

## 输入格式

输入文件第一行为两个整数 n,m(1<= n,m<= 100),接下来 n 行,每行 m 个数字,用空格隔开,0 或 1。

## 输出格式

一个整数,最大正方形的边长。

## 样例 #1

### 样例输入 #1

```
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
```

### 样例输出 #1

```
2
```

解题思路

对每一个为1的位置进行搜索,判断这个位置的右边和左边是不是为1,如果为1,就对这个位置的右下角那个位置进行同样的操作。

代码

#include <bits/stdc++.h>
using namespace std;
int g[110][110];                       //保存数据
int n,m;
int x2,y2;                                  //保存初始位置
int sum;
int dfs(int x,int y)
{
    int x3,y3;
    for(x3=x2;x3<=x;x3++)                   //判断下方
        if(g[x3][y]==0)
            return 0;
    for(y3=y2;y3<=y;y3++)                   //判断右边
        if(g[x][y3]==0)
            return 0;
    sum++;                                  //边长加1
    dfs(x+1,y+1);                           //继续判断右下角
    return sum;
}
int main()
{
    int x,y,max1=0;
    scanf("%d%d",&n,&m);
    for(x=1;x<=n;x++)
    {
        for(y=1;y<=m;y++)
        {
            scanf("%d",&g[x][y]);
        }
    }
    for(x=1;x<=n;x++)
    {
        for(y=1;y<=m;y++)
        {
            if(g[x][y]==1)
            {
                x2=x;
                y2=y;
                sum=0;
                max1=max(max1,dfs(x2,y2));
            }
        }
    }
    printf("%d",max1);
    return 0;
}

# [NOIP2008 普及组] ISBN 号码

## 题目描述

每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如 `x-xxx-xxxxx-x`,其中符号 `-` 就是分隔符(键盘上的减号),最后一位是识别码,例如 `0-670-82162-4`就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如 0 代表英语;第一个分隔符 `-` 之后的三位数字代表出版社,例如 670 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

识别码的计算方法如下:

首位数字乘以 1 加上次位数字乘以 2 ……以此类推,用所得的结果  mod 11,所得的余数即为识别码,如果余数为 10,则识别码为大写字母 X。例如 ISBN 号码 `0-670-82162-4` 中的识别码 4 是这样得到的:对 `067082162` 这 9 个数字,从左至右,分别乘以 1,2,……,9 再求和,即 0* 1+6*2+……+2* 9=158,然后取 158 mod 11 的结果 4 作为识别码。

你的任务是编写程序判断输入的 ISBN 号码中识别码是否正确,如果正确,则仅输出 `Right`;如果错误,则输出你认为是正确的 ISBN 号码。

## 输入格式

一个字符序列,表示一本书的 ISBN 号码(保证输入符合 ISBN 号码的格式要求)。

## 输出格式

一行,假如输入的 ISBN 号码的识别码正确,那么输出 `Right`,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符 `-`)。

## 样例 #1

### 样例输入 #1

```
0-670-82162-4
```

### 样例输出 #1

```
Right
```

## 样例 #2

### 样例输入 #2

```
0-670-82162-0
```

### 样例输出 #2

```
0-670-82162-4
```

解题思路

简单题,要注意的是识别码为X的情况。

代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
char g[50];
int j[50];
int main()
{
    int x,y,z=0,k=1;
    scanf("%s",g+1);
    for(x=1;g[x]!='\0';x++)
    {
        if(g[x]>='0'&&g[x]<='9')
        j[k++]=g[x]-'0';                      //把数字拿出来
        else if(g[x]=='X')                    //当识别码为X的时候要为它赋10
            j[k++]=10;
    }
    for(x=1;x<10;x++)
    {
        z+=j[x]*x;
    }
    if(z%11==j[x])
        printf("Right");
    else
        {

            for(x=1;x<=12;x++)
                printf("%c",g[x]);
            if(z%11!=10)
                printf("%d",z%11);
            else
                printf("%c",'X');
        }
    return 0;
}

# [yLOI2023] 苦竹林

## 题目描述

共有 n 个风铃悬挂在屋檐下,每个风铃都能发出一定音调的声音。从左到右给风铃从 1 至 n 编号,第 i 个风铃的音调是 ai。

为了表达内心的思念,扶苏决定在 n 个的风铃中取出 m 个,送给远方的朋友。

请你找到最小的整数 q,使得存在一种方案,能够从 n 个风铃中挑出 m 个,设挑出风铃的音调为 b1, b2, …… bm,满足对任意的 1 <= i, j <= m,都有 |bi - bj| <= q。

## 输入格式

第一行是两个整数,表示风铃的个数 n 和挑选出风铃的个数 m。  
第二行有 n 个整数,表示每个风铃的音调。第 i 个整数表示 ai。

## 输出格式

输出一行一个整数,表示最小的 q。

## 样例 #1

### 样例输入 #1

```
5 3
1 2 3 4 5
```

### 样例输出 #1

```
2
```

## 样例 #2

### 样例输入 #2

```
6 4
1 7 8 3 4 6
```

### 样例输出 #2

```
4
```

## 提示

### 样例 2 解释

一种选择的方案是选择第 2,4,5,6 四个风铃,音调依次为 7,3,4,6。可以得到对任何的 1 <= i, j<= 4,都有 |bi - bj| <= 4。

另一种方案是选择第 2,3,5,6 四个风铃,同样计算得到的 q 为 4。

### 数据规模与约定

- 对 10% 的数据,m = 2。
- 另有 10% 的数据,m = n。
- 对 40% 的数据,n <= 5。
- 对 60% 的数据,保证对所有的 2 <= i <= n,满足 a[i - 1] <= ai,即 ai 单调不降。
- 对 80% 的数据,n <= 10^3。
- 对 100% 的数据,2 <= m <= n <= 10^5,1 <= ai <= 10^9。

解题思路

把数据排一下序,然后模拟一个窗口,用窗口内最大的值减去最小的值就是这个窗口的q,然后我们让这个窗口向后滑动并及记录下最小值就行了。

代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
long long a[1000001];
int main()
{
    long long n,m,x,l,r,min2=9999999999;
    scanf("%lld%lld",&n,&m);
    for(x=1;x<=n;x++)
        scanf("%lld",&a[x]);
    sort(a+1,a+n+1);
    l=1;r=m;
    while(r<=n)
    {
            min2=min(min2,a[r]-a[l]);
        l++;r++;
    }
    printf("%lld",min2);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值