4-17笔试

一、彩票中奖。

彩票中奖的规则为购彩票的后x位与公布的中奖号码的后x位相同

第一行输入两个数n和m分别表示买的初始彩票号,和连续的m个彩票。

接下来多行,每行若干个整数,第一个整数表示x,中奖彩票的位数x,其余的整数表示中奖的号码的后x位。

读入以END表示结束

 

如果没有中奖输出“NO”

如果中奖,输出“YES”,第二行依次输出中奖的完整号码,以空格分割。

输入示例:

1703458045 21

4 8048 9567

5 23456 44444 98456

6 234432 456654 678876 

9 121212123 545454545

END

输出样例:

YSE

1703458048

 

 

二、给定一个长度为n的数组,求连续的先下降后上升的子数组的最大长度

输入示例:

6

3 2 1 2 1 8

输出样例:

4

 

三、给定长度为n的数组,求所有连续子数组中和能被b整除的区间个数

第一行输入n和b;

第二行输入n个数;

输入样例:

3 3

1 2 3

输出样例:

3

样例解释:

区间[3],区间[1,2],区间[1,3]的和分别是3,3,6符合题意,所以答案是3

 

四、给定n个物品,以及每个物品的价值w[i]和限制条件s[i],限制条件表示取第i个物品,则接下来的s[i]个物品不能取。求n个物品可以取得的最大值。

第一行输入n,表示n个物品

接下来n行,每行两个整数w和s,表示物品的价值和限制条件

输入样例:

3

2 2

1 1

1 1

输出样例:

2

样例解释:

取第1个物品获得价值2,接下来2个都不能取

取第2个物品获得价值1,接下来1个不能取

取第3个物品获得价值1,

所以最大价值是2

#include <iostream>
#include <vector>

using namespace std;
int n;
int w[100010], s[100010];
int dp[100010];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> w[i] >> s[i];
        dp[i] = w[i];
    }
    for (int i = n-1; i >= 1; i--) {
        if (i+s[i]+1 <= n){
            dp[i] = max(dp[i+1], dp[i+s[i]+1] + w[i]);
        }else {
            dp[i] = max(dp[i], dp[i+1]);
        }
            
    }
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum = max(dp[i], sum);
        //cout << dp[i]  << ' '<< endl; 
    }
    cout << sum <<endl;
    /*
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j < i; j++) {
            if (j + s[j] < i) {
                dp[i] = max(dp[i], dp[j] + w[i]);
            }
        }
    }
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum = max(dp[i], sum);
       //cout << dp[i]  << ' '<< endl; 
    }
    cout << sum <<endl;
    */
    return 0;
}

 

posted @ 2022-04-17 20:59  TTTCoder  阅读(92)  评论(0编辑  收藏  举报