题意:就是给你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;
}