SDKD 2016 Winter Single Training B, div2 出题总结

来源:互联网 发布:淘宝小说 编辑:程序博客网 时间:2024/05/19 09:43

0* :A 本来0*准备了一道很水的01背包,套板子就能过的那种,就不说了。


1* -1 :E HDU 5491 The Next

这个题没有出有点出乎意料,可能也因为打的人比较少,这题是去年网赛的题,就是给了一个数字,找出二进制数在a~b之间的,比这个数大的第一个数,最简单的方法就是把这个数字用二进制表示出来,存储二进制的逆序,如果要比它大,一定是在它某一个为0的位置上变成1,又要求最小,所以从低位向高位就可以了,每到一个为0的地方,判断将它置1,前面全部置0后1的个数是否满足条件,若所有1的个数仍然比b大,则向后枚举下一个为0的位置,直到最高位。若1的总数大于a小于b,则直接把该位置为1,之前为0,这个数就是最小的数。若总数小于a,则从最低位开始往上设置1,由此保证这个数是满足要求的最小的数。(咦我不会调行间距了凑合看吧。。。)

推荐的套路题:Codeforces div2 A B C


1* -2:C HDU 5093 Battle Ships

这题是个二分图,也是当时我第一次学二分图的时候做的题,是个很经典的建图,具体的就是先按行划分,再按列划分,然后建图,求一个最大匹配就可以了。

样例1可以划分成:

*ooo                           行                   1ooo                   列              1ooo

o###                                                 o###                                     o###

**#*                                                   22#3                                     23#4

ooo*                                                  ooo4                                     ooo4

然后建出来图就是这样的:



二分图的讲解:我是链接

推荐的基础题:就是这个题。


1* -3:D HDU 1954 POJ 1635 Subway Tree Systems

这道题我没有写题解,是POJ上Northwestern Europe 2003的题。。。但我记得是道很好的题,题目看起来有点麻烦,大意就是给出搜索一棵树的序列,0表示向下搜索,1表示回溯,然后问你搜索的两棵树能不能经过变换变成一棵树,就是是否是同构的,将树的每个子树都用一个字符串来表示,每次搜完一个节点就把所有的子树sort一下,按字典序排列,最后判断两棵树得到的串是不是一样就可以了。代码可以参考下面这份:

#include <iostream>#include <cstdio>#include <string>#include <vector>#include <algorithm>using namespace std;int T,n,k,sum,t;string str1, str2;string min_pre(string str){      vector<string> box;      string ret = "";      int equal = 0, st = 0;      for(int i = 0; i < str.size(); i++){           if(str[i] == '0') equal++;           else equal--;           if(equal == 0){                if(i - 1 > st + 1)                    box.push_back("0" + min_pre(str.substr(st + 1,i - 1 - st)) + "1");                else box.push_back("01");                st = i + 1;           }      }      sort(box.begin(), box.end());      for(int i = 0; i < box.size(); i++) ret += box[i];      return ret;}int main(){      int ca;      scanf("%d", &ca);      while(ca--){           cin >> str1 >> str2;           if(min_pre(str1) == min_pre(str2)) printf("same\n");           else printf("different\n");      }}

1* -4:B Codeforces 628D Magic Numbers

这个是最近做的题,当时把所有的题目教的之后教主说div2就扔D太快了,这个题其实还好,数位DP我感觉套路都差不多,,除了特别难的那种,只要真的做会了一道,大部分简单的就都会了,就是调起来比较麻烦。这个题是求a到b中有多少个数是m的倍数并且是d-magic的,就是只有偶数位出现过的,那么记忆化就可以开成二维的,第一维是已经求得的,长度为i时满足magic条件的数的个数,第二维是对m取余的余数,然后就是细节问题了。这个的话参考代码没什么意义,理解起来不太容易,不过还是放一下吧。我的代码


推荐的基础题:我是链接



0 0
原创粉丝点击