牛客题目:神秘餐馆

神秘餐馆

https://ac.nowcoder.com/acm/problem/21312

题目:
一家神秘餐馆准备开放N天,牛牛 和 牛妹听到这个消息后,准备尽可能多的一起去吃午饭
餐馆有M道菜,牛牛和牛妹每次来只允许点一道菜,如果在第i天买了第j道菜
那么第i+7天也只能买第j道菜
第i天第j道菜的价格为price[i][j]
'0'-'9'代表0-9美元
'A'-'Z'代表10-35美元
'a'-'z'代表36-61美元
牛牛和牛妹一共只有budget美元,请问他们最多可以吃几天的午饭

分析:这里最难处理的部分就是这个限制条件:第i天第j道菜的价格为price[i][j]。为了处理这个条件我们要解决一个问题:某一天的哪一餐在我们没钱吃饭之前是性价比最高的(特别注意没钱吃饭之前)。这里的处理方法:先不要管后面第i+7天某一餐的价格,我们就先将7天内价格最少的那一餐吃了,在吃的时候注意用数组a[i%7][j]储存第i%7天第j餐的总价格(注意是总价格),(如果第0+1(说第0天有点怪怪的,因为数组从0开始,但按我们的习俗是说第1天,所以就成0+1天)天吃第0+1餐是1元,第7+1天吃第0+1餐是10元,那么a[0][0]=11),吃完7天之后,发现还有钱去吃,然后吃第8天的按规定也只能吃第1餐,但我突然发现第八天第1餐与第1天第1餐价格之和要高于第二餐的,这下别急,有一行很关键的代码sum-=minn[i%7](sum是到目前为止花了多少钱,minn[i%7]是第i%7天最便宜的那一餐,注意这个是会发生变化的,可能第一天minn[0]=1,到了第八天可能minn[0]=5,因为后者是第一天和第八天最低价格,而前者只是第一天最低价格),我先减去我第一天所花费的钱(就是反悔,第一天的这一餐我先不吃了,你先把钱还给我,我结合第一天和第八天哪一餐最划算我到时候一起付),然后再结合第八天和第一天的具体价格,再次获取minn[0](这个minn[0]是第八天和第一天花费最少的一餐的总价格),然后再来一个sum+=minn[i%7](意思是我刚刚反悔不吃第一天的第一餐,现在我考虑第八天和第一天第二餐要更划算,现在我重新付给你第八天和第一天第二餐的总价钱)。

源代码:

#include <bits/stdc++.h>
using namespace std;
int n,m,budge;
int meal[52][52],minn[52],a[52][52];//二重数组a的目的是将第i%7天第j餐的总价格记录下来,比如a[0][1],那么就是第一天第二餐的价格+第八天第二餐价格直到没钱吃;minn[i]是记录下第i%7天某一餐价格总和的最小值
int main()
{

      int sum=0;
      cin>>n>>m>>budge;
      char b[n+2][m+2];
      for(int i=0;i<n;i++)//这个循环的目的是将输入的字符价格转换为数字价格
      {
          for(int j=0;j<m;j++)
          {
              cin>>b[i][j];
              if(b[i][j]>='0'&&b[i][j]<='9')meal[i][j]=b[i][j]-'0';
              else if(b[i][j]>='a'&&b[i][j]<='z')meal[i][j]=(int)b[i][j]-61;
              else if(b[i][j]>='A'&&b[i][j]<='Z')meal[i][j]=(int)b[i][j]-55;
          }
      }
      for(int i=0;i<n;i++)
      {
          sum-=minn[i%7];//这里减去minn[i%7]的目的是,如果第一天第二餐只要1元,第一餐要5元,那么minn[0]肯定是1对吧,但是如果第八天的时候第二餐要10元,第一餐只要3元那么综合第一天和第八天那么肯定吃第一餐花费最少,所以这一步的作用就相当于反悔,我不吃第一天的第二餐了,所以sum就减去minn[0]
          for(int j=0;j<m;j++)a[i%7][j]+=meal[i][j];//将第i%7天第j餐的价格加起来
          minn[i%7]=a[i%7][0];//先将第i%7天最小价格赋值为i%7天中任意某一餐的总价格
          for(int j=0;j<m;j++)
          {
              if(a[i%7][j]<minn[i%7])minn[i%7]=a[i%7][j];//获取第i%7天中花费最少的那一餐,用数组minn[i]储存起来
          }
          sum+=minn[i%7];//sum先加上第i%7天的花费最少的那一餐
          if(sum>budge)
          {
              cout<<i;
              return 0;
          }
      }
      cout<<n;
}
全部评论

相关推荐

牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
头像
11-07 01:12
重庆大学 Java
精致的小松鼠人狠话不多:签哪了哥
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务