CQU&CQUPT联合狂欢赛小结

概述:今天25道题,AC了11道,不到一半的题。惭愧惭愧。不过还是颇有收获的。就AC题目和今晚补的题做些小结

狂欢赛链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84555#overview


狂欢赛C题:[Codeforces122C]Lucky sum

这道题在比赛的时候并没有做出来,想到了把幸运数字存下来的方法。然后区间求和。<——这和我今晚补题的思路是一样的。但是在比赛中我觉得这种方法涉及到两样东西:存幸运数字 + 区间求和 == 麻烦。(另外怎么存幸运数字并没怎么多想,感觉枚举排列好麻烦)

其实枚举就是这么简单的dfs下去即可:

void dfs(ll sum)
{
	if (sum > 1e9)
	{
		num[cnt++] = sum;
		return;
	}
	num[cnt++] = sum;
	dfs(sum * 10 + 4);
	dfs(sum * 10 + 7);
} 
然后区间求和即可。


狂欢赛L题:[CodeForces127B]Canvas Frames

一道没有任何trick的题。人人都1A了。我竟然WA了。然后OJ上只显示了WA2以为是精度问题,又WA了2发,之后发现是WA21。还是不明白为什么。最后终于知道是数组开小了。真是对自己无语。


狂欢赛R题:[CodeForces129C]Statues

比赛的时候想到了可以默认棋盘不动,而M要每回合默认向上移动一格。赛后补题证明思路是可行的。但是赛中却输在了各种细节处理上。比如如何剪枝,如何表示当前的石块坐标等等。


狂欢赛S题:[CodeForces129D]String

求字符串的第K个子串是什么。新知识get。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN = 1e5 + 111;
typedef long long LL;
string s;
int k;

struct Sub{
	string s;
	int pos;
	bool operator < (const Sub& t)const
	{
		return s > t.s;
	}
};

int main()
{
	cin >> s >> k;
	priority_queue<Sub> pq;
	int len;
	for( len = 0; s[len]; ++len){ pq.push( Sub{ string(1,s[len]), len } ); }
	if (k > LL(len) * LL(len + 1) / 2)
	{
		cout << "No such line.\n" ; return 0 ;
	}
	else
	{
		int cnt = 0;
		while( !pq.empty() )  
		{
			Sub temp = pq.top() ; pq.pop() ;
			if( ++cnt == k )
			{
				cout << temp.s << '\n' ; return 0 ;
			}
			if( temp.pos != len - 1 )
			{
				temp.s += s[++temp.pos];
				pq.push( temp ) ;
			}
		}
	}
	return 0;
}

狂欢赛E题: [CodeForces122E]Lucky Permutation

并没有打算补的一道题。不过新知识get——康托展开

代码实现:

void CantorR( int index , int n )
{
	bool vis[MAXN];
	memset( vis , 0 , sizeof vis );
	index-- ; //减去自身
	for( int i = 0 ; i < n ; ++i )
	{
		int t = index / fact[n - i - 1] ;
		for ( int j = 0 ; j <= t ; ++j ) if( vis[j] ) ++t ;
		p[i] = t + 1;
		vis[t] = 1;
		index %= fact[n - i - 1];
	} 
} 

总述:还是会在做题的时候嫌这麻烦,那个麻烦。真是TAT。不好不好。。。。。


你可能感兴趣的:(CQU&CQUPT联合狂欢赛小结)