2611. 老鼠和奶酪

Posted lxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2611. 老鼠和奶酪相关的知识,希望对你有一定的参考价值。

题目链接:2611. 老鼠和奶酪

方法:贪心

解题思路

题目要求第\\(mouse1\\)恰好吃掉 \\(k\\) 块奶酪的情况下,计算最大得分。

  • 假设\\(mouse1\\)当前吃掉了下标为\\(i\\)处的奶酪,那么应该满足,\\(diff[i] = reward1[i] - reward2[i]\\)是当前所有\\(diff\\)值的最大值,这样就可以保证\\(mouse1\\)吃掉当前的奶酪,为得分做出"最大贡献";
  • 我们可以假设所有奶酪都被\\(mouse2\\)吃掉,然后再加上\\(diff\\)数组中的前\\(k\\)个最大值,就表示相应的奶酪让\\(mouse1\\)吃掉。

代码

class Solution 
public:
    int miceAndCheese(vector<int>& reward1, vector<int>& reward2, int k) 
        int n = reward1.size();
        vector<int> diff(n);
        int score = 0;
        for (int i = 0; i < n; i ++ ) 
            diff[i] = reward1[i] - reward2[i];
            score += reward2[i]; 
        
        sort(diff.begin(), diff.end(), greater<int>());
        int idx = 0;
        while (idx < k) score += diff[idx ++ ];
        return score;
    
;

复杂度分析

时间复杂度:\\(O(nlogn)\\)
空间复杂度:\\(O(n)\\)

aoj0558

一、题意: 在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪。有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪。老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次),且老鼠只能吃硬度不大于当前体力值的奶酪。老鼠从当前格走到相邻的无障碍物的格(上下左右)需要时间1单位,有障碍物的格不能走。走到工厂上时即可吃到该工厂的奶酪,吃奶酪时间不计。问吃遍所有奶酪最少用时。

 

二、思路:从0到n,做n次bfs,求出各个最短路径后相加。这里需要注意一下几点:1、没做一次bfs之前距离矩阵要初始化  2、可以在输入时就记录下起始位置和各个奶酪工厂的坐标,也可以在做bfs的过程中通过数值进行判断,都可以,只是提前记录下来写出来的代码思路会更清晰一点,所付出的就是增加一定的空间。

 

三、代码:

#include"iostream"
#include"stdio.h"
#include"queue"
using namespace std;

const int MAXN=1005;
const int INF=100000000;
typedef pair<int,int> P;

char maze[MAXN][MAXN];
int dist[MAXN][MAXN];
P factory[15];

int h,w,n;

void DistOrigin()
{
    for(int i=0;i<h;i++)
        for(int j=0;j<w;j++)
            dist[i][j]=INF;
}

bool Judge(int x,int y)
{
    if(x>=0&&x<h&&y>=0&&y<w&&maze[x][y]!=‘X‘&&dist[x][y]==INF)
        return true;
    return false;
}

int Bfs(P pS,P pE)
{
    queue<P> que;
    DistOrigin();
    dist[pS.first][pS.second]=0;
    que.push(pS);

    while(que.size())
    {
        P p=que.front();
        que.pop();
        if(p==pE) break;
        int dx[4]={0,1,0,-1};
        int dy[4]={1,0,-1,0};
        for(int i=0;i<4;i++)
        {
            int nx=p.first+dx[i];
            int ny=p.second+dy[i];
            if(Judge(nx,ny))
            {
                dist[nx][ny]=dist[p.first][p.second]+1;
                que.push(P(nx,ny));
            }
        }
    }
    return dist[pE.first][pE.second];
}

int main()
{
    while(scanf("%d%d%d",&h,&w,&n)==3)
    {
        for(int i=0;i<h;i++)
        {
            for(int j=0;j<w;j++)
            {
                cin>>maze[i][j];
                char tmp=maze[i][j];
                if(tmp!=‘.‘&&tmp!=‘X‘){
                    if(tmp==‘S‘)
                    {
                        factory[0]=P(i,j);
                    }
                    else
                    {
                        factory[tmp-‘0‘]=P(i,j);
                    }
                }
            }
        }
        int sum=0;
        for(int i=0;i<n;i++)
        {

            int time=Bfs(factory[i],factory[i+1]);
            if(time!=INF)
                sum+=time;
            else
                break;
        }
        cout<<sum<<endl;
    }
    return 0;
}

  

  

以上是关于2611. 老鼠和奶酪的主要内容,如果未能解决你的问题,请参考以下文章

[ZJOI2010]贪吃的老鼠(网络流+建图)

UVA - 1001 Say Cheese(奶酪里的老鼠)(flod)

UVa 1001 奶酪里的老鼠(Dijkstra或Floyd)

Luogu P2570 [ZJOI2010]贪吃的老鼠

Cheese Aizu - 0558 (bfs)

AOJ 0558 CheeseBFS