您的位置:首页 > 运维架构

TopCoder SRM 607 题解

2014-02-03 22:30 337 查看
。。。第一次进div1,就一道都没有搞出来,第一题理解错了题意,第二题乱搞没有成功,第三题没看 。果然深夜+感冒不是适合刷题的模式啊,不过幸好还保持在blue。

最后看了看WJMZBMR神犇的代码,表示自己果然傻逼,连第一题这样的傻逼题都没A。

250pt:

分奇数和偶数长度分别讨论,然后直接枚举中心和长度计算即可。。。

(一开始理解错题意,以为不是按顺序拼凑,对出题人只能呵呵,明明输入一个字符串就行了,偏偏要用向量存,我还以为可以随意组合。果然英语是硬伤。)

/* Ciocio's TopCoder Template */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <deque>
#include <functional>
#include <vector>
#include <stack>
#include <list>
#include <bitset>

using namespace std;

#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rrep(i,b,a) for(int i=b;i>=a;--i)
#define sz(x) x.size()
#define ll long long
#define p_b push_back
#define m_p make_pair
#define pii pair<int,int>

class PalindromicSubstringsDiv1{
public:
double same(char a,char b){
if(a=='?'||b=='?') return 1.0/26.0;
return a==b?1.0:0.0;
}

double expectedPalindromes(vector <string> S1, vector <string> S2){
string S=accumulate(S1.begin(),S1.end(),string());
S+=accumulate(S2.begin(),S2.end(),string());
double rt=0.0;
int n=S.length();
//
rep(i,0,n-1){
double cur=1.0;
rt+=cur;
for(int l=1;i-l>=0&&i+l<=n-1;++l){
cur*=same(S[i-l],S[i+l]);
rt+=cur;
}
}
//
rep(i,0,n-2){
double cur=same(S[i],S[i+1]);
rt+=cur;
for(int l=1;i-l>=0&&i+1+l<=n-1;++l){
cur*=same(S[i-l],S[i+1+l]);
rt+=cur;
}
}
return rt;
}
};

475pt:

(还在想,先放AC代码)

/* Ciocio's TopCoder Template */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <deque>
#include <functional>
#include <vector>
#include <stack>
#include <list>
#include <bitset>

using namespace std;

#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rrep(i,b,a) for(int i=b;i>=a;--i)
#define sz(x) x.size()
#define ll long long
#define p_b push_back
#define m_p make_pair
#define pii pair<int,int>
#define INF (~0U>>3)

class CombinationLockDiv1{
public:
int minimumMoves(vector <string> P, vector <string> Q){
string S=accumulate(P.begin(),P.end(),string());
string T=accumulate(Q.begin(),Q.end(),string());

int n=sz(S);
vector <int> a(n);
rep(i,0,n-1){
a[i]=S[i]-T[i];
if(a[i]<0) a[i]+=10;
}
a.p_b(0);
++n;
rrep(i,n-1,1){
a[i]-=a[i-1];
if(a[i]<0) a[i]+=10;
}
//change a[i] into every 0
vector <int> am(1,0);
//pos-neg:min pos
am[0]=0;
int posSum=0,negSum=0;
rep(i,0,n-1){
//cout<<a[i]<<endl;
if(!a[i]) continue;
int up=10-a[i],down=a[i];
int nextPosSum=posSum+up;
int nextNegSum=negSum+down;
vector <int> nam(nextPosSum+nextNegSum+1,INF);
rep(j,-negSum,posSum){
int cur=am[j+negSum];
if(cur==INF) continue;
//up
nam[j+up+nextNegSum]=min(nam[j+up+nextNegSum],cur+up);
nam[j-down+nextNegSum]=min(nam[j-down+nextNegSum],cur);
}
am=nam;
posSum=nextPosSum;
negSum=nextNegSum;
}
return am[0+negSum];
}
};


1000pt:

(现场没人搞出来)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: