151012测试的总结

151012测试的总结

也许是目录:

  • 第一题
  • 第二题
  • 第三题
  • 最后的总结

第一题

模拟||trie
【题目及题号】文件列表 superoj920
【第一次】AC
【题解】
第一种做法,建trie树,然后跑一跑就好了。
第二种做法,强制排序判断模拟搞一搞,输出来就好了。数据范围很小,不会出问题。
【考试ING】
看了一下,先用string排了个序,然后记录了一下分段的长度和起点,然后和上一次输出的字符判断。

中间发现一个问题,string的单字符输出是没有问题的,切出来再输出是非常慢的,
不过可以记一下string切字符的函数。

模拟||trie

第二题

dp || 堆
【题目及题号】 编译优化 superoj921
【第一次】70%accept 30%wrong anwser
【题解】
自己的做法:
第一部分60% 写了一个O(nm)的DP,f[i][j]表示到第i个数已经选了j个数的最优解。
方程
f[i][j]=max(f[i-1][j],f[i-2][j-1]+a[i]);
然后分别从[1,n)和(1,n]跑两次,记得赋初值为-INF。
第二部分写了个贪心骗了十分。
贪心是这样的,建立大根堆,弹m个合法的点出来加起来输出。

标算:用到了网络流中残余网络的思想。
对于每个节点记录l[k],r[k],并且根据节点的值建立大根堆;
每次取出堆顶元素k,ans+=a[k];
然后更新a[k]=a[l[k]]+a[r[k]]-a[k],调整堆,还要更新l[r[k]]=k,r[l[k]]=k;l[k]=l[l[k]],r[k]=r[r[k]];
然后删除堆中原本的l[k],r[k];

我的做法是将其num赋成最大值到堆顶后删除【将堆最后的元素放到顶,并n–】;
现在发现上面那个做法非常蠢,其实可以将其赋成-INF下调就可以了。
两种方法对比一下区别不大,下面的可以少写一个函数(up函数),而上面的堆在不断地减小,会快一些【实测】。

代码见下

void up(int x)
{
    int k=x>>1,v=x;
    code tmp=heap[x];
    while(k>0){
        if(tmp.num<heap[k].num) break;
        heap[v]=heap[k];
        inheap[heap[v].pos]=v;
        v=k;
        k>>=1;
    }
    heap[v]=tmp;
    inheap[heap[v].pos]=v;
}
void delet(int x)
{
    heap[x].num=INF;
    up(x);
    heap[1]=heap[cnt];
    cnt--;  
    down(1);
}

【考试ING】
考试的时候还写了一个非常非常裸的dp是O((n^2)*m)的;
然后拿来和上面那个dp对拍,拍了三千组小数据没有错,拍了一千组大数据到最后错掉了。╮(╯▽╰)╭
最后拍小数据终于拍出了错,我随便改了一个地方【不知道改的哪里】,然后就对了。
到现在都不知道是什么导致的,心塞。Orz!

比较重要的一个收获:发现dp的转移方式和维数无法再降复杂度的时候,可以大胆猜结论标算不是dp哟~【遇到两次这种情况了。

第三题

搜索 && 并查集
【题目及题号】 树形图计数 superoj922
【第一次】90%accept 10%Tle
【题解】
最坏情况8^8先枚举根节点再枚举每个点的父亲,i可以作为j父亲的条件是j不是i的祖先,可以维护并查集来判断。
我的做法(2^e)*n e是边的数量,剪了一些枝,7*7的完全图可以一秒出解。
【考试ING】
最后一题看上去就像个搜索题,秉着写暴力的良知,搞了个最暴力的出来,其实我应该再思考一下的。
这个故事告诉我们

要把暴力当标算写,能尽量快就让它飞起来。Orz!

另外据说GJY和我写的是一样的,然而他A掉了。
不愧是老司机Orz!!!!

最后的总结

最后总分260,跪琦爷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值