这个周仍旧尽量有空闲时间就到实验室呆着,到现在,状压dp一共做了4道题了,都是课件上的原题。。还有不少原题~~今晚继续做,还得补补昨天的题
昨天比赛单打的,A了一个D题,D比较简单,就是分组,唯一麻烦一点的就是要对应着输出相同数值 的位置,建两个数组存一下位置,然后查找输出就可以了、、
然后做的B题,也不是很难,关键是输出的要是字典排序最小的答案,昨天没有做出来,TLE了,后来回去想了一下,感觉有可以优化的地方,
然而,刚才做的时候,一直矛盾。。就搜了题解,结果发现题解的循环比我的更多!!不应该是TLE啊,于是就再重新看,结果,发现!!做的地方竟是因为数组的下标都是计算的,所以超时!!记录一下再用,就A了!!!
AC的:
for(i=0;i<a.size();i++)
{
v=a[i]-'A';
if(l[v]>r[v])
{for(int j=k;j<26;j++)
{
if(l[j]<r[j]&&j!=(v))
{k=j;
if(j<v)
{l[v]--;l[j]++;a[i]='A'+j;++ans;}
else{
if(r[v]>0){l[v]--;r[v]--;}
else{l[v]--;l[j]++;a[i]='A'+j;++ans;}
}
break;
}
}
}
}
TLE的:
for(int i=0;i<strlen(a);i++)
{
if(l[a[i]-'A'+1]>r[a[i]-'A'+1])
{for(int j=k;j<=26;j++)
{if(l[j]<r[j]&&j!=(a[i]-'A'+1))
{k=j;
if(j<a[i]-'A'+1)
{l[a[i]-'A'+1]--;l[j]++;a[i]='A'+j-1;}
else{ if(r[a[i]-'A'+1]>0){l[a[i]-'A'+1]--;r[a[i]-'A'+1]--;}
else { l[a[i]-'A'+1]--;l[j]++;a[i]='A'+j-1;
}
}
break;
}
}
}
}
C题好像也不太难,是B类的嘛,但是还没看。。一会想着看看,然后搜搜题解看看,差不多就不做了,得赶紧刷状压dp了