概述:今天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; }
并没有打算补的一道题。不过新知识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。不好不好。。。。。