TopCoder SRM 607 题解

。。。第一次进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:

(现场没人搞出来)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值