进击的2016。。
题解正在努力写。。
T1:http://blog.csdn.net/gmh77/article/details/52964643
这题刚开始是想用贪心,结果因为数组少打了1个0所以少了40分。。。
先说说贪心的思想。
因为组数要尽量分多,所以我们可以从大到小排序,就是把大的数放在一堆组成一队,剩下的较小数就可以组成更多的队伍。
反例:
1 2 4 5 5 5 5 5
如果我们从右往左找,把5个5分成一队,剩下的就不足4人,所以无法成立。
所以正解应该是这样:
(1 2) (4 5 5 5 5 5)
所以我们可以把贪心转化成DP:
设F[i]表示从1到i能组成队伍数的最大值。
根据之前的结论,可以很容易推出方程:
F[i]=max(F[j]+1) (1≤j≤i-a[i])
But——
这种方法的时间复杂度是近似O(N^2),所以会超时。
预知后事请看http://blog.csdn.net/gmh77/article/details/52964643
T2:http://blog.csdn.net/gmh77/article/details/52965011
这道题刚开始做时一脸懵逼,知道正解后发现竟是如此之水。。。
60分:
BFS枚举,设D[i,1]表示当前的a,D[i,2]表示当前的b,D[i,3]表示当前进行了D[i,3]次操作。
之后再加优化:
①:如果当前算出的a或b超过了N,就已经不成立了。
②:如果当前进行的操作已经超过了之前算出的最小值,无论对错都可以不用继续进行了。
BFS因为数据量过于庞大,所以要么数组爆炸要么答案错误。
100分:http://blog.csdn.net/gmh77/article/details/52965011
T3:http://blog.csdn.net/gmh77/article/details/52965211
T3题解:
100分(总分200):
根据数据范围可以知道,100%的数据撤销操作不会撤掉之前的撤销操作。
所以撤销操作能撤掉的只有插入操作。而插入操作每次都是在最末尾,所以每次把后X个字母删掉就可以了。
180分:
设a[i]表示第i次出现的结果,每产生一个新的结果后,就把i的值增加1,把新出现的结果放到a[i]中。
从数据得知,UNDO操作是可以撤掉UNDO操作的。所以我们不能直接删字母。
因为UNDO是最后X次操作,所以如果遇到UNDO就把a[i]赋值为a[i-x-1]。