差分入门、数组专题(基础组与提高组共用)

这篇文章介绍了几个编程题目,涉及差分入门、教室外的风景、专用牛棚、热水器、减减加加以及创新型的九位累进可除数问题。每个题目描述了输入输出格式、示例数据和限制条件,主要考察对序列操作和计算能力的理解与应用。
摘要由CSDN通过智能技术生成

目录

A. 差分入门

Description

Format

Input

Output

Samples

输入数据 1

输出数据 1

Limitation

B. 教室外的风景 

Background

Description

Format

Input

Output

Samples

输入数据 1

输出数据 1

Limitation

C. 专用牛棚 

Background

Description

Format

Input

Output

Samples

输入数据 1

输出数据 1

Limitation

D. 热水器 

Background

Description

Format

Input

Output

Samples

输入数据 1

输出数据 1

输入数据 2

输出数据 2

hint

Limitation

E. 减减加加

Description

Format

Input

Output

Samples

输入数据 1

输出数据 1

Hint

Limitation

F. 【创新型】第8章:数组 九位累进可除数 

说明

输出格式


A. 差分入门

Description

输入一个长度为n的整数序列。

接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。

请你输出进行完所有操作后的序列。

Format

Input

第一行包含两个整数n和m。

第二行包含n个整数,表示整数序列。

接下来m行,每行包含三个整数l,r,c,表示一个操作。

1 ≤ n , m ≤ 100000 .

Output

共一行,包含n个整数,每个数字后面一个空格,表示最终序列。

Samples

输入数据 1

6  3
1  2  2  1  2  1
1  3  1
3  5  1
1  6  1

Copy

输出数据 1

3  4  5  3  4  2

Copy

Limitation

1s, 256000KiB for each test case.

基本差分的使用,不会的可以先学一学差分的使用 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100005];
int b[100005];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    while(m--){
        int l,r,c;
        cin>>l>>r>>c;
        b[l]+=c;//左边界加c
        b[r+1]-=c;//右边界+1后再减c
    }
    for(int i=1;i<=n;i++){
        b[i]+=b[i-1];
        cout<<a[i]+b[i]<<' ';
    }
    return 0;
}

B. 教室外的风景 

Background

Special for beginners, ^_^

Description

小猪上初中了,初中真好啊,有很多自修课哦。很多同学喜欢在自修课时到教室外面去,说是到老师那问问题J。 学校规定,自修课到教室外去的每个同学都必须做好登记,每次进出教室的登记是以一对整数a和b来描述的,表示 某一个同学在时刻a时到教室外面,在时刻b以后回到教室内。也就是说在时刻a至时刻b的这段时间中,这个登记的 同学一直在教室外面。校长想知道最多有多少同学在同一时刻都在教室外面,但同学们进进出出教室的记载实在很 乱,于是校长请参加信息学兴趣小组的小猪来统计。

Format

Input

第一行只有一个整数n,表示共有n个同学进出教室的记载。

接下来n行,每行二个整数a和b,表示有一个同学在第a时刻出了教室,他在第b时刻后回到教室。

1≤n≤100000,1≤a≤b≤100000.

Output

仅有一行,该行只有一个整数,表示最多有多少同学在同一时刻都在教室外面。

Samples

输入数据 1

4 
2 6 
8 9 
1 5 
1 2

Copy

输出数据 1

3

Copy

Limitation

1s, 255024KiB for each test case.

统计n个人的进出时间,记录下在外面最大的结果

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100005];
int main(){
    int n;
    cin>>n;
    while(n--){
        int l,r;
        cin>>l>>r;
        a[l]++;
        a[r+1]--;
    }
    int ans=0;
    for(int i=0;i<=100000;i++){
        a[i]+=a[i-1];
        ans=max(ans,a[i]);
    }
    cout<<ans;
    return 0;
}

C. 专用牛棚 

Background

Special for beginners, ^_^

Description

有N头牛,每头牛有个喝水时间,这段时间它将专用一个Stall

现在给出每头牛的喝水时间段,从A到B,问至少要多少个Stall 才能满足它们的要求

1 <= N <= 50,000

1 <= A <= B <= 1,000,000

保证A<=B

Format

Input

第一行给出数字N

接下来N行

每行两个数字a,b代表某头牛喝水的开始与结束时间.

Output

至少要多少个stall

Samples

输入数据 1

5
1 10
2 4
3 6
5 8
4 7

Copy

输出数据 1

4

Copy

Limitation

1s, 255024KiB for each test case.

 都是类似题

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[1000005];
int main(){
    int n;
    cin>>n;
    while(n--){
        int l,r;
        cin>>l>>r;
        a[l]++;
        a[r+1]--;
    }
    int ans=0;
    for(int i=0;i<=1000000;i++){
        a[i]+=a[i-1];
        ans=max(ans,a[i]);
    }
    cout<<ans;
    return 0;
}

D. 热水器 

Background

Special for beginners, ^_^

Description

一个热水器,每分钟可以提供 W 升热水,现在有 N 个人使用,第 i 个人计划每分钟使用 Pi 升热水

从 Si 时间开始到 Ti 结束(不包括 Ti 时间点)。

问给出的使用计划是否可行。

Format

Input

第一行给出N,W

接下来N行,每行三个数字,分别代表Si,Ti,Pi

1≤N≤2×10^5

0≤Si<Ti≤2×10^5

1≤W,Pi≤10^9 .

Output

见样例

Samples

输入数据 1

4 10
1 3 5
2 4 4
3 10 6
2 4 1

Copy

输出数据 1

No

Copy

输入数据 2

4 10
1 3 5
2 4 4
3 10 6
2 3 1

Copy

输出数据 2

Yes

Copy

hint

样例数据 1

根据样例数据可知,热水器可以每分钟提供 10 升水。

第一个人数据,从第 1 分钟开始到第 3 分钟结束,每分钟使用 5 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5

第二个人数据,从第 2 分钟开始到第 4 分钟结束,每分钟使用 4 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4=9 3 4

第三个人数据,从第 3 分钟开始到第 10 分钟结束,每分钟使用 6 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4=9 3 4+6=10 4 6 5 6 6 6 7 6 8 6 9 6

第四个人数据,从第 2 分钟开始到第 4 分钟结束,每分钟使用 1 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4+1=10 3 4+6+1=11 4 6 5 6 6 6 7 6 8 6 9 6

从表格数据可以看出,在第 3 分钟,需要的热水为 11 升,超过了热水器可以供应的用水。 所以输出 No。

样例数据 2

根据样例数据可知,热水器可以每分钟提供 10 升水。

第一个人数据,从第 1 分钟开始到第 3 分钟结束,每分钟使用 5 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5

第二个人数据,从第 2 分钟开始到第 4 分钟结束,每分钟使用 4 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4=9 3 4

第三个人数据,从第 3 分钟开始到第 10 分钟结束,每分钟使用 6 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4=9 3 4+6=10 4 6 5 6 6 6 7 6 8 6 9 6

第四个人数据,从第 2 分钟开始到第 3 分钟结束,每分钟使用 1 升。 因此可以写出数据表格如下: 时间 用水 1 5 2 5+4+1=10 3 4+6=10 4 6 5 6 6 6 7 6 8 6 9 6

从表格数据可以看出,热水器可以供应的用水。所以输出 Yes。

Limitation

1s, 255024KiB for each test case.

同上 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[1000005];
int main(){
    int n;
    ll m;
    cin>>n>>m;
    while(n--){
        int l,r,c;
        cin>>l>>r>>c;
        a[l]+=c;
        a[r]-=c;
    }
    ll ans=0;
    for(int i=0;i<=200000;i++){
        a[i]+=a[i-1];
        ans=max(ans,a[i]);
    }
    if(ans>m)cout<<"No";
    else cout<<"Yes";
    return 0;
}

E. 减减加加

Description

给你一个数列,共N个数字 你可以对每个数字,做如下三种操作之一

1:将这个数字加1

2:将这个数字减去1

3:什么事也不做

最终希望在这个数列中,某个数字出现的次数越多越好,输出出现次数即可。

Format

Input

第一行给出N

第二行给出N个数字

N<=1e5,数字的权值在[0,1e5]之间.

Output

如题

Samples

输入数据 1

7
3 1 4 1 5 9 2

Copy

输出数据 1

4

Copy

Hint

将这个数列变成2 2 4 2 5 9 2

Limitation

1s, 102400KiB for each test case.

由于数据量非常少,所以只需记录下来每个数字出现的次数,如何枚举所有数据求出正确答案即可 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100005];
int main(){
    int n;
    cin>>n;
    map<int,int>m;
    for(int i=0;i<n;i++){
        cin>>a[i];
        m[a[i]]++;
    }
    sort(a,a+n);
    int ans=0;
    for(int i=0;i<=100000;i++){
        ans=max(ans,m[i]+m[i-1]+m[i+1]);
    }
    cout<<ans;
    return 0;
}

F. 【创新型】第8章:数组 九位累进可除数 

说明

求九位累进可除数。所谓九位累进可除数就是这样一个数:这个数用到1到9这九个数字组成,每个数字刚好只出现一次。这九个位数的前两位能被2整除,前三位能被3整除......前N位能被N整除,整个九位数能被9整除。

输出格式

1个九位数。

枚举字符串全排列,每次切割判断是否满足条件直到找到符号条件的九位数

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
    string s="123546789";
    do{
        for(int i=0;i<9;i++){
            int x=stoi(s.substr(0,i+1));
            if(x%(i+1)!=0){
                break;
            }
            if(i==8){
                cout<<s;
                return 0;
            }
        }
    }while(next_permutation(s.begin(),s.end()));
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值