寻找签到题之路

题目描述 

举办一场新生赛还需要几个签到题,Hammer 决定去寻找境外势力的帮助。经过打听,Hammer 得知 AGC 里全是签到题,于是他报名了下一场 [AtCoder Grand Contest] ,打算直接从里边搬两个题当做新生赛的签到题。在 contest 进行前,Hammer 先去了解了一下 Atcoder 的比赛规则。

一场 Atcoder 比赛会持续 T 分钟,共有 n 道题,在你 AC 第 i 题后可以得到 si​ 的分数。比赛以总分数来进行排名,若总分数相同则以最后一次有效 AC 时间排名,越早者排名越靠前。(实际比赛会以AC之前的错误提交来计算罚时,因为Hammer 是一个良心的出题人,所以在这里我们无需考虑罚时。)

Hammer 深知自己的水平高低,对于每道题目看一眼题目名字就知道自己 AC 这道题需要多少分钟(可以假设 Hammer 拿到了时光机器,早已提前看过了题,比赛中无需再花费时间看题)。请你计算 Hammer 如果按照能获得尽可能高排名的方式去答题,最终的得分会是多少。

输入描述:

输入第一行两个正整数 n (1≤n≤20)n\,(1 \le n\le 20)n(1≤n≤20) 和 T (1≤T≤104)T\,(1\le T\le 10^4)T(1≤T≤104) ,分别表示这场比赛的总题数以及比赛持续的时间(时间以分钟为单位)。 接下来 nnn 行每行两个正整数 si (1≤si≤103)s_i\,(1 \le s_i\le 10^3)si​(1≤si​≤103) 和 ti (1≤ti≤T)t_i\,(1\le t_i\le T)ti​(1≤ti​≤T) ,分别表示第 iii 道题的分值与 Hammer 要想 AC 第 iii 道题所需要的时间(时间以分钟为单位)。

​时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

输出描述:

输出一行一个整数,表示 Hammer 在取得其最高排名情况下的得分。

示例1

输入

复制

4 10
12 6
9 5
8 5
2 3

输出

复制

17

说明

Hammer 可以选择去做第 2 题与第 3 题,恰好花费 10 分钟,获得 17 分。没有得到更高得分的方法了。

解题思路

本题目是一个很常见的01背包问题,考虑背包动态规划。我们可以讲这题目数量看作物品个数,把分数看作价值,把时间看作物品和背包的体积。

代码如下

#include<stdio.h>
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
int main()
{
    int n,T;
    int a[100000];
    scanf("%d %d",&n,&T);
    int s,t,j;
    for(int i=0;i<n;i++)
    { 
        scanf("%d %d",&s,&t);
        for(j=T;j>=t;j--)
            a[j]=max(a[j],(a[j-t]+s));
    }
    printf("%d",a[T]);
    return 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值