1 条题解

  • 0
    @ 2025-8-24 21:24:49

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar x义x
    “我们要走多远?”“一百万年。”

    搬运于2025-08-24 21:24:49,当前版本为作者最后更新于2018-04-01 10:43:02,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    一道很简单的贪心模拟题~

    想必大家已经想出贪心思路了:只有当一个zombie抵达第一列,我们才会不得不放坚果。很显然,这肯定是最佳方案。

    具体实现思路是对每一行单独处理,对于每一只抵达第一行的zombie,用坚果杀死它,顺便杀死所有当前也在这行的zombie。

    到底怎么写呢?请看代码。

    #include<bits/stdc++.h>
    using namespace std;
    
    int t[7][2001];
    int n,ans;
    
    int main()
    {
    	cin>>n;
    	int j[7];for(int i=1;i<=6;i++) j[i]=0;  //喜闻乐见的读入环节~ 
    	
    	for(int i=1;i<=n;i++)  //这里用time[i][j]表示第i行的第j只zombie的抵达时间 
    	{
    		int t1,t2;cin>>t1>>t2;
    		t[t1][++j[t1]]=t2+60;
    	}
    	
    	for(int i=1;i<=6;i++)
    		sort(t[i]+1,t[i]+1+j[i]);
    	/*
    	for(int i=1;i<=5;i++)
    	{
    		for(int k=1;k<=j[i];k++)
    			cout<<t[i][k]<<' ';
    		cout<<endl;
    	}
    	*/  //调试时用的 
    	for(int i=1;i<=6;i++) //对每一行分别处理
    	{
    		int x=1; //从这一行的第一只zombie开始碾压 
    		while(x<=j[i])
    		{
    			ans++;
    			int x1=x; 
    			while(t[i][x1]<t[i][x]+60) x1++;
    			//碾压所有同时在这一行的zombies!!注意<不能打成<=,否则样例都过不了 
    			x=x1;
    		}
    	 }
    	
    	cout<<ans; 
     } 
    

    总之,其实这题真的不难,不过在一些细节方面上要注意。

    比如:

    • 这道题的行数有6行而不是真正的pvz里的5行,我因为找不出这个错误还专门在讨论里发了个帖子……蠢啊
    • 样例中zombie出现的次序是排序好的,但数据不是,所以要sort一下。如果刚学快排可以拿这题练练手。
    • 注释中警告的那处。我们要碾压的最前面的zombie是在第1行,但第1+60=61行的那只zombie还没走上草地,所以那里应该是<而非<=。

    感谢浏览!如果你认为这篇题解的讲解还不错的话,请您为这篇题解点赞哦~

    • 1

    信息

    ID
    407
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者