2018蓝桥杯校选复现11

题目

SLW表示要升级他的导弹井,准备从 蔻蔻·海克梅迪亚 那里购入一批新型的战术核显卡RTX2080。已知这一批核弹的初始价格为x,蔻蔻接下来会有n次的折扣活动,第i次折扣活动的开始时间为li,结束时间为ri,减免的价格为yi。SLW手上还有m张蔻蔻的折扣券,第j张抵用券的开始时间为lj,结束时间为rj,减免的价格为yj。折扣活动和抵用券可以叠加使用。但是折扣活动和折扣活动不能叠加,抵用券和抵用券也不能叠加。(即你在一个时间只能选取一个折扣活动和一张抵价券)

输入格式:

第一行分别是x∈[1,30000000] 这一批核弹的初始价格, n∈[1,200000] 折扣活动的次数 , m∈[1,200000] 抵用券的数量

接下来n 行每行 有 l∈[1,200000] r∈[1,200000],y∈[1,200000]. 分别为每个折扣时间的开始结束, 降低的价格

接下来m行每行 有 l∈[1,200000] r∈[1,200000],y∈[1,200000]. 分别为抵用券能够使用的开始时间和结束时间 和 抵用价格

输出格式:

输出SLW最低能以多少的价格购入战术核显卡。(最低价格不小于0)

输入样例:

在这里给出一组输入。例如:

50000 3 2
1 5 2000
3 4 4000
1 3 3000
1 2 1500
4 6 3000

输出样例:

在这里给出相应的输出。例如:

43000


#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
int a[200001]={0};
int b[200001]={0};
int main()
{
    int x,n,m;
    scanf("%d%d%d",&x,&n,&m);
    int start,over,cut;
    int len=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d%d%d",&start,&over,&cut);
        if(over>len)
            len=over;
        for(start;start<=over;start++)
            if(a[start]<cut)
                a[start]=cut;
    }
    for(int i=0;i<m;i++)
    {

        scanf("%d%d%d",&start,&over,&cut);
        if(over>len)
            len=over;
        for(start;start<=over;start++)
            if(b[start]<cut)
                b[start]=cut;
    }
    int ans=0;
    for(int i=1;i<=len;i++)
    {
        a[i]=a[i]+b[i];
        if(ans<a[i])
            ans=a[i];
    }
    ans=x-ans;
    if(ans<0)
        printf("0\n");
    else
        printf("%d\n",ans);
    return 0;
}

分析

  1. 这是我超时的代码块:但是能拿到5分
  2. 思想就是设置两个较大的数组,以数组下标作为日期,分别存储每天优惠活动的最大值(在输入数据的时候就开始存储)
  3. 输入完毕后将两个数组相加,找出最大值然后用总价减去该最大值即为所求
  4. 这样虽然能求得答案,但是数据量大时超时。。。以我目前的知识还没办法解决。。。
发布了21 篇原创文章 · 获赞 4 · 访问量 788

猜你喜欢

转载自blog.csdn.net/u011025050/article/details/103267555
今日推荐