概述:今天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。不好不好。。。。。