• NEERC2012


    NEERC2012

    A - Addictive Bubbles

    题目描述:有一个(n imes m)的棋盘,还有不同颜色的棋子若干个,每次可以消去一个同种颜色的联通块,得到的分数为联通块中的棋子数的平方,消掉后高处的棋子会落到下面。设计一个摆法,使得在最优策略下能得到最多的分数。

    solution
    同种颜色的棋子摆在一起即可。

    时间复杂度:(O(nm))

    B - Blind Problem Solving

    题目描述:有(n)个物品,一个容量为(c)的背包,每个物品的大小为(w_i),找出一种方案使得在不超过容量的前提下装的物品的总大小最大。但问题是(w_i)是未知的,系统中初始有一个选择方案(A(bitset)),每次先将(B=A),然后随机改变(B)的一个位置,然后将(B)这种方案对应的物品总大小告诉你,你要选择是否接受这个方案,如果接受,则令(A=B),否则舍去,当(B)为最优解时停下。

    solution
    首先花费一定的步数使得(A)为全选(期望步数(nlnn)),接着花费一定步数使得(A=0)(期望步数为(nlnn)),同时记下每一个物品的大小,然后做一次(dp),算出最优方案,然后当每次询问增加的大小恰好是需要的大小之一时接受,否则舍去,当为最优方案时停下。

    时间复杂度:(O(2^n))

    C - Caravan Robbers

    题目描述:给出(n)个区间,现在要求一个最大的长度(k),使得将每个区间变成一个长度为(k)的子区间后,所有区间不相交,求(k).

    solution
    这道题的问题在于答案是个分数,所以要先小数二分出答案,然后求出最接近这个答案的分数,而答案的分母不会超过(10^6)

    时间复杂度:(O(nlogn))

    D - Disjoint Regular Expressions

    题目描述:给出两个正则表达式,问是否存在一个字符串满足这两个表达式,存在则输出字符串。

    solution
    不会。

    E - Exact Measurement

    题目描述:有(n)个箱子,每个箱子里有(q_i)个大小为(10^{k_i})的砝码,输出一种使用箱子数最少的方案,使得使用的箱子中的砝码能表示(x)(只能相加)。

    solution
    (k_i)给箱子分类,先满足(x)的低位,因为高位可以用低位的填,但低位不能用高位的填。然后贪心,先打开砝码比较多的箱子,记住剩余的砝码(打开了箱子,但没有用到的砝码),到下一位时首先使用之前剩余的砝码,再打开新的箱子。

    时间复杂度:(O(nlogn))

    F - Folding Snake Cube

    不懂。

    G - Great Deceiver

    题目描述:给出(n, k),问(1)~(n)有多少个数在(k)进制和(-k)进制下相同。

    solution
    奇次幂只能是(0),然后数位(dp)

    时间复杂度:(O(64))

    H - Hyperdrome

    题目描述:给定一个字符串,问有多少个子串重排后是一个回文串。

    solution
    重排后为回文串,也就是最多有一种字符的出现次数为奇数。如果只记住每种字符出现的奇偶性,求前缀,则当子串的右端为(i)时,需要求出有多少个左端(j)的前缀奇偶性与(i)最多相差一个位,这个可以(hash)处理。

    时间复杂度:(O(n))

    I - Identification of Protein

    J - Jumping Around

    题目描述:在坐标轴上从(0)出发,每次向左或向右移动(1,2,3)个单位,给出移动(1,2,3)个单位的次数分别为(a, b, c),求出一种方案使得(0)~(n-1(n-1=a+b+c))每个点都经过一次。

    solution
    首先从前往后用完所有的(c),然后连接(1,2),按(c)(3)取余的情况决定最后的收尾,然后连接(n-2, n-1),从后往前用完所有(b),然后中间的空缺用(a)填。

    时间复杂度:(O(n))

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn=(2e4)+100;
    
    int a, b, c, n;
    int f[maxn][10];
    
    void add(int x, int y)
    {
    	f[x][++f[x][0]]=y;
    	f[y][++f[y][0]]=x;
    }
    void solve()
    {
    	n=a+b+c+1;
    	for (int i=0; i<n; ++i) f[i][0]=0;
    
    	for (int i=0; i<c; ++i) add(i, i+3);
    	add(1, 2);
    	add(n-2, n-1);
    
    	if ((c%3) & 1)
    	{
    		add(c, c+2);
    		add(c+1, c+3);
    		b-=2;
    		c+=3;
    	}
    	else
    	{
    		add(c, c+1);
    		c+=2;
    	}
    
    	for (int i=0; i<b; ++i) add(n-1-i, n-3-i);
    	for (int i=c; i<n-b-2; ++i) add(i, i+1);
    	for (int i=0, cur=0, pv=-1; i<n; ++i)
    	{
    		printf("%d ", cur);
    		int tmp=cur;
    		if (f[cur][1]!=pv) cur=f[cur][1];
    		else cur=f[cur][2];
    		pv=tmp;
    	}
    	puts("");
    }
    int main()
    {
    	freopen("jumping.in", "r", stdin);
    	freopen("jumping.out", "w", stdout);
    	int casesum;
    	scanf("%d", &casesum);
    	while (casesum--)
    	{
    		scanf("%d%d%d", &a, &b, &c);
    		solve();
    	}
    	return 0;
    }
    

    K - Kingdom Reunion

    L - Labyrinth of the Minotaur

    题目描述:给定一个地图,将其中一块正方形空地变成障碍,使得左上角与右下角不连通,求正方形边长最小值。

    solution
    听别人讲方法大概是枚举正方形左上角,则这个正方形必须是最大的,然后判断是否存在一条障碍路径将左上角与右下角分开。具体实现不太清楚。

  • 相关阅读:
    Java学习笔记二.2
    Java学习笔记二.1
    Java学习笔记一
    cookie和session笔记
    编码知识笔记
    新手前端笔记之--css盒子
    新手前端笔记之--初识css
    新手前端笔记之--必备的标签
    新手前端笔记之--初识html标签
    二叉树总结
  • 原文地址:https://www.cnblogs.com/GerynOhenz/p/9438034.html
Copyright © 2020-2023  润新知