problem1 link

直接模拟。

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class Arrows { public int longestArrow(String s) {
int result=-1;
for(int i=0;i<s.length();++i) {
final char c=s.charAt(i);
if(c=='<') {
int len=1;
if(i+1<s.length()&&(s.charAt(i+1)=='-'||s.charAt(i+1)=='=')) {
++len;
for(int k=i+2;k<s.length()&&s.charAt(k)==s.charAt(i+1);++k) {
++len;
}
}
result=Math.max(result,len);
}
else if(c=='>') {
int len=1;
if(i-1>=0&&(s.charAt(i-1)=='-'||s.charAt(i-1)=='=')) {
++len;
for(int k=i-2;k>=0&&s.charAt(k)==s.charAt(i-1);--k) {
++len;
}
}
result=Math.max(result,len);
}
}
return result;
}
}

problem2 link

把词建一个树,那么对于一个节点$u$,如果$u$不是一个单词,那么$f(u)=\prod _{v\in S_{u}}f(v)$,否则$f(u)=1+\prod _{v\in S_{u}}f(v)$.$S_{u}$表示$u$的孩子集合。

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class PrefixFreeSubsets { static class Tree {
public boolean end;
Tree[] sons=null; public Tree() {
end=false;
sons=new Tree[26];
} } static Tree head=null; public long cantPrefFreeSubsets(String[] words) {
head=new Tree();
for(String s:words) {
Tree cur=head;
for(int i=0;i<s.length();++i) {
int t=s.charAt(i)-'a';
if(cur.sons[t]==null) {
cur.sons[t]=new Tree();
}
cur=cur.sons[t];
}
cur.end=true;
}
return dfs(head);
} static long dfs(Tree cur) {
long result=1,num=0;
for(int i=0;i<26;++i) {
if(cur.sons[i]==null) {
continue;
}
result*=dfs(cur.sons[i]);
++num;
}
if(num==0) {
return 2;
}
if(cur.end) {
++result;
}
return result;
}
}

problem3 link

设$f[i]=1$ 表示先手赢,$f[i]=0$ 表示后手赢。由于每次拿的石子数范围是$[1,22]$,所以如果出现两个位置$p,q$,使得$f[p],f[p+1],..,f[p+21]$与$f[q],f[q+1],..,f[q+21]$完全相等,那么就形成一个循环。所以只需要暴力找到这个循环位置即可。

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class LongLongNim { static boolean[] f=new boolean[1<<22];
static int[] g=new int[1<<22]; public int numberOfWins(int maxN,int[] moves) {
Arrays.fill(f,false);
Arrays.fill(g,-1);
f[0]=false;
int pre=0;
int start0=-1,start1=-1;
for(int i=1;i<=maxN;++i) {
boolean ok=false;
for(int j=0;j<moves.length&&i>=moves[j];++j) {
if(!f[i-moves[j]]) {
ok=true;
break;
}
}
f[i]=ok;
if(f[i]) {
pre=pre<<1|1;
}
else {
pre=pre<<1;
}
if(i>22&&(pre&(1<<22))!=0) {
pre^=1<<22;
}
if(i<22) {
continue;
}
if(g[pre]==-1) {
g[pre]=i-21;
}
else if(i-21-g[pre]>=22){
start0=g[pre];
start1=i-21;
break;
}
}
if(start0==-1) {
int result=0;
for(int i=1;i<=maxN;++i) {
if(!f[i]) {
++result;
}
}
return result;
}
int result0=0,result1=0;
for(int i=1;i<start0;++i) {
if(!f[i]) {
++result0;
}
}
for(int i=start0;i<start1;++i) {
if(!f[i]) {
++result1;
}
}
maxN-=start0-1;
result1*=maxN/(start1-start0);
maxN%=start1-start0;
for(int i=0;i<maxN;++i) {
if(!f[start0+i]) {
++result1;
}
}
result1+=result0;
return result1;
}
}

  

topcoder srm 330 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. 漏洞复现:Struts2 远程代码执行漏洞(S2-033)

    docker pull medicean/vulapps:s_struts2_s2-033 docker run -d -p 80:8080 medicean/vulapps:s_struts2_s2 ...

  2. 2017高教杯数学建模B 题分析

    B题原文 "拍照赚钱"是移动互联网下的一种自助式服务模式.用户下载APP,注册成为APP的会员,然后从APP上领取需要拍照的任务(比如上超市去检查某种商品的上架情况),赚取APP对 ...

  3. leetCoder-wordBreak判断能否分词

    题目 Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determ ...

  4. 1.sklearn库的安装

    sklearn库 sklearn是scikit-learn的简称,是一个基于Python的第三方模块.sklearn库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的 ...

  5. html5 手机端 通讯录 touch 效果

    不说那么多直接上代码. <html> <head> <meta http-equiv="Content-Type" content="tex ...

  6. Codeforces Round #324 (Div. 2) E

    这题贪心,考虑先放第一个,然后从第一个数在p中的位置, 不断的往前走,和在他后面的那些数组进行交换,因为这样交换可以提高最大的效率,就是说你花费了1但是使得两个点都朝他的木匾节点减少了1 #inclu ...

  7. 解释器模式 Interpreter

    代码例子 参考 1.解释器模式定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 说明:解释器模式设计到文法规则和抽象语法树. 2.解释器模式的结构 ...

  8. 1分钟完美安装最新CentOS+Nginx+PHP-FPM+MySQL

    PHP 5.3.1 MySQL 5.0.89 Nginx 0.8.33 或 0.7.65 (可选) 现在,我们可以快速全自动搞定 CentOS + Nginx + PHP-FPM + MySQL 的安 ...

  9. Step4:SQL Server 跨网段(跨机房)复制

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考 ...

  10. Hadoop HA方案调研

    原文成文于去年(2012.7.30),已然过去了一年,很多信息也许已经过时,不保证正确,与Hadoop学习笔记系列一样仅为留做提醒. ----- 针对现有的所有Hadoop HA方案进行调研,以时间为 ...