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. 老鼠和奶酪的主要内容,如果未能解决你的问题,请参考以下文章
UVA - 1001 Say Cheese(奶酪里的老鼠)(flod)