题目内容
最近小洋迷上了一款名叫打地鼠的游戏,但是小洋是个游戏白痴,这么简单的游戏也总是得不到几分,有一天他发现这款游戏可以在网络上买到外挂,这款外挂可以提前预知某一刻地鼠出现的时间,但是这个外挂有个缺陷,预知第is时出现的地鼠,那么第i+1s时无法使用这个外挂。并且他可以开局得到两把锤子,之前小洋1s只能挥动一次锤子,现在他左右开弓可以同时打中最多两只地鼠。每只地鼠在第i秒出现,在第i+1秒的时候就会消失。也就是说在第i秒小洋只能打到这一秒出现的地鼠,(i-1)秒以及(i+1)秒出现的地鼠他都没办法打中。
输入
一个整数n,表示地鼠的数目
一个整数m,表示此次游戏时长
接下来n个整数a_1-a_n,表示地鼠会在第a_i秒出现
1 <= a_i <= m
1 <= n <= 1000;
1 <= m <= 100000;
每只地鼠最多停留一秒
输出
一个整数,表示小洋最高得分(每打中一只地鼠得一分)
输入样例
样例输入1:
4
9
1 1 4 7
样例输入2:
6
10
3 3 3 3 9 1
样例输出
样例输出1:
4
样例输出2:
4
分析
不知道贪心能不能水过
首先想到应该这题是动归,第i s的情况仅与前面的选择有关.
根据题意可知,选择了第i-1s的地鼠,那么第is的地鼠就不能选择.
第is的值要么是选择第i-1s的得分,要么选择在1~i-2s内最大的得分+i s地鼠的个数.
那么第i s的得分,dp[i]=max(dp[i-1],max(dp[1~i-2])+a[i])
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stdio.h>
#include<stdlib.h>
#ifndef INF
#define INF 1000000
#endif
#ifndef NULL
#define NULL 0
#endif
using namespace std;
int dp[INF], a[INF];
int main()
{
int n, m;
cin >> n >> m;
priority_queue<int >q;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
a[x]++;
if (a[x] > 2)
a[x] = 2;
}
dp[1] = a[1];
q.push(dp[0]);
for (int i = 2; i <= m; i++) {
dp[i] = max(dp[i - 1], q.top() + a[i]);
q.push(dp[i - 1]);
}
cout << dp[m] << endl;
return 0;
}