C. Gourmet Cat(Mod思维题)

在这里插入图片描述在这里插入图片描述
题意:就是给你a,b,c,表示不同类的的各自数量;
然后第一个食物在1,4,7吃一个单位,第二个食物在2,6吃一个单位,第三种食物在3,5吃一个单位;
问:从1–7中选一天出来开始旅行,保证在下一天遇到的食物能有存储来吃,问在这种能连续吃的情况下最长的天数;
其实可以列一下表:
比如:
在这里插入图片描述
其实一看这个就是f:r:c==3:2:2,那么我算一个最小周期不就对了吗?然后剩下的就在一个循环里面就可以了;
所以我取min(f/3,min(r/2,c/2));
但是剩下的f,r,c应该怎么办?枚举?怎么枚举?
我一直没想到结果有人取个Mod就OK了,这就有点巧妙了;而且还能保持连续;
其实我一开始对剩下的f,r,c是这样想的:
在这里插入图片描述
复制一份加到后面相当于循环了;但是我一直不知道怎么枚举;
QAQ;
然后看了大佬的代码;我才发现可以这样编号来枚举:
在这里插入图片描述
取个mod7就可以了;
AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    
    
     ll a,b,c;
     scanf("%lld %lld %lld",&a,&b,&c);
     ll Min=min(a/3,min(b/2,c/2));
     ll ans=Min*(3+2+2);
     a-=Min*3;
     b-=Min*2;
     c-=Min*2;
     ll f=a,r=b,cc=c;
     ll Max=0,t=0;
     for(int i=1;i<=7;i++){
    
    
            t=0;
            f=a;r=b;cc=c;
        for(int j=0;j<=6;j++){
    
    
            int tt=(i+j)%7;
            if(tt==0||tt==1||tt==4){
    
    
                  if(f){
    
    
                      f--;t++;
                  }else break;
            }
            if(tt==2||tt==6){
    
    
                  if(r){
    
    
                     r--;t++;
                  }else break;
            }
            if(tt==3||tt==5){
    
    
                if(cc){
    
    
                   cc--;t++;
                }else break;
            }
        }
        Max=max(t,Max);
     }
     printf("%lld\n",ans+Max);
   return 0;
 }

猜你喜欢

转载自blog.csdn.net/qq_44555205/article/details/102595547