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的数组,求连续的先下降后上升的子数组的最大长度
输入示例:
3 2 1 2 1 8
输出样例:
三、给定长度为n的数组,求所有连续子数组中和能被b整除的区间个数
第一行输入n和b;
第二行输入n个数;
输入样例:
3 3
1 2 3
输出样例:
样例解释:
区间[3],区间[1,2],区间[1,3]的和分别是3,3,6符合题意,所以答案是3
四、给定n个物品,以及每个物品的价值w[i]和限制条件s[i],限制条件表示取第i个物品,则接下来的s[i]个物品不能取。求n个物品可以取得的最大值。
第一行输入n,表示n个物品
接下来n行,每行两个整数w和s,表示物品的价值和限制条件
输入样例:
2 2
1 1
1 1
输出样例:
样例解释:
取第1个物品获得价值2,接下来2个都不能取
取第2个物品获得价值1,接下来1个不能取
取第3个物品获得价值1,
所以最大价值是2
#include#include 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 < */ return 0; }