开挂的小洋 (改)

题目内容

  最近小洋迷上了一款名叫打地鼠的游戏,但是小洋是个游戏白痴,这么简单的游戏也总是得不到几分,有一天他发现这款游戏可以在网络上买到外挂,这款外挂可以提前预知某一刻地鼠出现的时间,但是这个外挂有个缺陷,预知第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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值