--12月月赛题解--

这篇博客详细解析了12月月赛中的8道编程题目,包括问题A的区间最大值、问题B的服务器调度、问题C的机器人能量规划、问题D的报数游戏、问题E的三角形排列、问题F的室友PY交易博弈、问题G的数字奇数分解以及问题H的值日生算术问题。通过题解,读者可以理解每道题目的解题思路和解决方案。
摘要由CSDN通过智能技术生成

12月月赛题解


问题 A: 求区间最大值

题目描述
给你一个长度为n的序列{a_1,a_2…a_n},下标从1到n,Q个询问,每次询问给出一个L和R,你需要输出最大的a_i,(L<=i<=R)
输入
单组数据
第一行给出n,(n<=1e6)
第二行有n个数代表{a_1,a_2…a_n},(a_i不超过int范围)
第三行给出q,代表有q个询问,(q<=1e6)
接下来q行每行给出两个数字代表L,R,(1<=L<=R<=n)
输出
对于每个询问,输出最大值
样例输入
4
2 1 3 4
2
1 2
1 4
样例输出
2
4

题解

线段树裸题

#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
int a[1000000];
int T[1000001*4];
inline void build(int l,int r,int rt){
    if(l==r){T[rt]=a[l];return;}
    build(lson);
    build(rson);
    T[rt]=max(T[rt<<1],T[rt<<1|1]);
}
inline int query(int l,int r,int rt,int L,int R){
    if(l>=L && r<=R)return T[rt];
    int ret=-1;
    if((l+r)/2>=L)ret=max(ret,query(lson,L,R));
    if((l+r)/2+1<=R)ret=max(ret,query(rson,L,R));
    return ret;
}
int main(){
    //freopen("in","r",stdin);
    //freopen("out1","w",stdout);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    build(1,n,1);
    int q;
    scanf("%d",&q);
    while(q--){
        int l, r;
        scanf("%d %d",&l,&r);
        printf("%d\n",query(1,n,1,l,r));
    }
    return 0;
}

问题 B: 服务器

题目描述
Bob的实验室中有n台服务器可以用来处理任务.每台服务器有一个独特的id–是一个从1到n的整数.
现在有q个任务要来,其中第i个任务的定义包含三个整数: ti –
这个任务到来的时刻(以秒为单位), ki –这个任务要 ki台服务器共同处理, di –处理这个任务时每台服务器所需要的时间.保证输入的所有ti是不同的.
为了完成第i个任务,你需要ki 台服务器在 ti秒没有被占用.一旦一台服务器开始执行任务的时候,他在接下来的di 秒将处于忙碌状态,即他将于ti, ti + 1, …, ti + di - 1秒处于忙碌状态.为了完成第i个任务,将用到ti时刻没有被占用的 ki 台id最小的服务器.如果 ti时刻没有被占用的服务器不足 ki ,那么这个任务将被忽略.
写一个程序判断哪些任务将被执行,那些任务将被忽略.
输入
输入包含一组数据
第一行包含两个整数n和q (1 ≤ n ≤ 100, 1 ≤ q ≤ 105),表示服务器的数量和任务的数量
接下来的q行,每行包含三个整数 ti, kiand di (1 ≤ ti ≤ 106, 1 ≤ ki ≤ n, 1 ≤ di ≤ 1000)表示第i个任务到来的时刻(秒),需要多少台服务器来运行以及每台服务运行他所需要的时间.任务将以字典序的顺序给出,并且每个任务的到来时间都不相同.
输出
打印q行,如果第i个任务将被服务器执行,在第i行打印运行第i个任务的服务器的id之和,否则打印-1.
样例输入
4 3
1 3 2
2 2 1
3 4 3
样例输出
6
-1
10

题解

按照描述模拟就好了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
using namespace std;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值