upc补题 JL的智力大冲浪+LCYZ的道路+YLB搭积木

6198: JL的智力大冲浪

题目描述
JL报名参加LCYZ的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则:
首先,比赛时间分为n个时段(n≤500),它又给出了很多小游戏,每个小游戏都必须在规定期限ti前完成(1≤ti≤n)。如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱wi,wi为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个时段内完成,而且都必须从整时段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者,JL很想赢得冠军,当然更想赢取最多的钱!注意:比赛绝对不会让参赛者赔钱!
输入
共4行。
第1行为m,表示一开始奖励给每位参赛者的钱;
第2行为n,表示有n个小游戏;
第3行有n个数,分别表示游戏1到n的规定完成期限;
第4行有n个数,分别表示游戏1到n不能在规定期限前完成的扣款数。
输出
仅1行。表示JL能赢取最多的钱。
样例输入
10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
样例输出
9950

题意:
一直都不懂题意,题意是在前多少时间内完成这个游戏,而没有说这个游戏花这些时间完成。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
struct  point
{
    int t,w,l;
} p[505];
int vis[505];
bool cmp(point a,point b)
{
    return a.w>b.w;
}
int main()
{
    int m;
    while(~scanf("%d",&m))
    {
        int n;
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&p[i].t);
        }
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&p[i].w);
        }
        sort(p+1,p+n+1,cmp);
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            p[i].l=0;
            for(int j=p[i].t;j>0;j--)
            {
                if(vis[j]==0)
                {
                    p[i].l=1;
                    vis[j]=1;
                    break;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(p[i].l==0)
            {
                m=m-p[i].w;
            }
        }
        printf("%d\n",m);

    }
}

6199: LCYZ的道路
时间限制: 1 Sec 内存限制: 128 MB
提交: 73 解决: 48
[提交][状态][讨论版][命题人:admin]
题目描述
由于在修新教学楼,LCYZ的路上出现了N个坑。为了尽快填补好这N个坑,LCYZ决定对M处地段采取封闭措施。为了求解方便,假设LCYZ的路只有一条,而且是笔直的。现在给出N个坑的位置,请你计算,最少要对多远的路段采取封闭措施?

输入
输入数据共两行,第一行为两个正整数N、M (2<=N<=15000,M<=N)。第二行给出了N个坑的坐标(坐标值均在int范围内,按从小到大的顺序给出,且不会有两个点坐标相同)。
输出
仅一行,为最小长度和。
样例输入
18 4
3 4 6 8 14 15 16 17 21 25 26 27 30 31 40 41 42 43
样例输出
25
提示
采取封闭措施的地段分别为:3-8,14-21,25-31,40-43。

来源

思路:
m个路段会有m-1个空隙,那么挑出最大的m-1个空隙,所要封闭的路段就少了。用总空隙减去你没封闭的长度就是你最后封闭的长度。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a[15005];
int b[15005];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        int k=0,num=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=1; i<=n-1; i++)
        {
            b[k++]=a[i+1]-a[i]-1;
        }
        sort(b,b+k,cmp);
        int sum=a[n]-a[1]+1;
        for(int j=0; j<m-1; j++)
        {
            sum=sum-b[j];
        }
        printf("%d\n",sum);
    }

}

6206: YLB搭积木
时间限制: 1 Sec 内存限制: 128 MB
提交: 102 解决: 54
[提交][状态][讨论版][命题人:admin]
题目描述
LCYZ举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。
在搭建开始之前,没有任何积木(可以看成n块高度为0的积木)。接下来每次操作,小朋友们可以选择一段连续区间[l,r],然后将第第L块到第R块之间(含第L块和第R块)所有积木的高度分别增加1。
YLB是个智障的小朋友,他想不出使得建造所需的操作次数最少的最佳策略。所以想请你帮他想出这个策略,并求出最少的操作次数。
输入
输入包含两行,第一行包含一个整数n,表示大厦的宽度。
第二行包含n个整数,第i个整数为hi 。
输出
仅一行,即建造所需的最少操作数。
样例输入
5
2 3 4 1 2
样例输出
5
提示
其中一种可行的最佳方案,依次选择
[1,5] [1,3] [2,3] [3,3] [5,5]
【数据范围】
对于 30%的数据,有1 ≤ n ≤ 10;
对于 70%的数据,有1 ≤ n ≤ 1000;
对于 100%的数据,有1 ≤ n ≤ 100000,0 ≤ hi≤ 10000。

来源

思路,以a[0]的高度为基高度,如果a[i]大于a[i-1],那么我至少要在a[0]的基础上操作a[i]-a[i-1]次,如果a[i]<=a[i-1],则不用考虑,因为此时的a[i]已经被搭好了,所以把这些a[i]-a[i-1]加起来再加上a[0]就是最终的结果。
代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int a[100005];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        int sum=a[1];
        for(int i=2;i<=n;i++)
        {
           if(a[i]>a[i-1])
           {
               sum+=a[i]-a[i-1];
           }
        }



        printf("%d\n",sum);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值