用记忆实际区间最左min1最右max1,来减小时间复杂度 但注意min1要初始化为里面可能的最大值或比最大值大一点,而max1则是最小值或比最小值小一点,这些也是要注意的吧,不小心漏掉,到时候出问题又要找bug。
也让自己意识到了else if 重叠用的时候该注意的(程序中打★★的地方)。
SSRaligun酱的魔法符文
source
UESTC 1019
My Solution
总结出那个框框里的东西,然后就好了,反正只有0、7种情况
1可以+2、+3
2可以+3
3可以+4
4可以+5、+6
5可以+6、+2、+4
6可以+1
且L[ i ] += b+1;并且L[ i ] <= 7
#include
#include
#include
#include
using namespace std;
const int maxn=2000+8;
int L[maxn];
int cot[9];
void solve(int i,int b)
{
if(L[i]==0) L[i]=b; //最开始的时候肯定是0了,所以讨论的时候这个不要漏掉
else if(L[i]==7) ;
else if(L[i]==6) {if(b==4||b==5||b==7||b==1) L[i]=7;} //★★
else if(L[i]==5) {if(b==6||b==4||b==2||b==7) L[i]=7;} //★★
else if(L[i]==4) {if(b==6||b==5||b==3||b==7) L[i]=7;} //★★
else if(L[i]==3) {if(b==4) L[i]=7;else if(b==2||b==1) L[i]+=b+1;else if(b==5||b==6||b==7) L[i]=b;} //L[i]+=b+1
else if(L[i]==2) {if(b==5) L[i]=7;else if(b==3||b==1) L[i]+=b+1;else if(b==4||b==6||b==7) L[i]=b;}
else if(L[i]==1) {if(b==6) L[i]=7;else if(b==3||b==2) L[i]+=(b+1);else if(b==4||b==5||b==7) L[i]=b;}
}
int main()
{
int T,n,m,l,r,type,min1,max1,ans,kase=0; //关于最大值最小值的使用,要初始化对。。 及其记忆来减小复杂度
scanf("%d",&T);
while(T--){
memset(L,0,sizeof(L));memset(cot,0,sizeof(cot));
min1=n;max1=0;ans=0; //min1和max1的置零
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&l,&r,&type);
min1=min(min1,l);max1=max(max1,r);
for(int i=l;i<=r;i++)
solve(i,type);
}
for(int i=min1;i<=max1;i++)
(cot[L[i]])++;//cout<<L[i]<<" ";
for(int i=1;i<=7;i++)
ans=max(ans,cot[i]);//cout<<cot[i]<<" ";}
printf("Case #%d:",++kase);
for(int i=1;i<=7;i++)
{if(cot[i]==ans) printf(" type%d",i);}
if(T) printf("n");
}
return 0;
}
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/uestc-1019-ssraligun/
共有 0 条评论