洛谷 P1413 坚果保龄球
题目描述
PVZ这款游戏中,有一种坚果保龄球。zombie从地图右侧不断出现,向左走,玩家需要从左侧滚动坚果来碾死他们。
我们可以认为地图是一个行数为6,列数为60的棋盘。zombie出现的那一秒站在这一行的第60列,之后每秒向左移动一步。玩家可以随时在屏幕最某一行第一列摆放坚果,这一行的zombie瞬间全被滚过去的坚果碾死。如果zombie走到第1列没有被消灭,如果再向左走,则你的大脑就会被zombie吃掉。
现在有n只zombie!告诉你每只zombie出现的时间以及在出现的行数(可能会同时出现同一位置的僵尸),请问至少需要多少坚果才能消灭所有的zombie。
输入输出格式
输入格式:
第一行一个正整数n,表示zombie数量。
之后n行中,每行两个正整数P和t,分别表示zombie所在行和zombie出现的时间。
输出格式:
一个正整数,最少需要的坚果数。
输入输出样例
输入样例#1:
10 1 1 1 61 2 1 2 60 3 1 3 2 3 3 3 4 4 1 4 99999
输出样例#1:
6
说明
【数据规模】
n<=2000,t<=100000,1<=P<=6
【题目来源】
kkksc03改编
贪心
#include <algorithm> #include <cstdio> using namespace std; struct node { int Line,T; bool operator<(node a)const { if(a.Line==Line) return T<a.T; else return Line<a.Line; } }zombie[2501]; int n; int main() { scanf("%d",&n); int Answer=0,Maxn; for(int i=1;i<=n;i++) { scanf("%d%d",&zombie[i].Line,&zombie[i].T); Maxn=max(Maxn,zombie[i].T); } sort(zombie+1,zombie+1+n); int i=1; while(i<=n) { int pos=zombie[i].Line,T_now=zombie[i].T-1; while(T_now<=Maxn) { T_now+=60; while(zombie[++i].Line==pos&&zombie[i].T<=T_now); if(zombie[i].Line!=pos) {Answer++;break;} if(zombie[i].T>T_now) {Answer++;break;} } } printf("%d",Answer); return 0; }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。