problem1 link

直接模拟即可。

problem2 link

首先,网关一定是安装在client与server之间的链路上。而不会安装在client与client之间的链路上。对于一条路径c1->c2->c3->c4->s,且不存在任何一个其他的client使得c4到该client存在链路且该client可以到达s。假设c1->c2之间的链路安装了,那么c4->s之间的链路还要安装。所以只需要在c4->s之间的链路安装即可。

所以所有的安装位置一定是在client与server之间的链路上。且对于某个安装的链路c->s不存在其他的$c^{'}$使得c->$c^{'}$存在链路且$c^{'}$可以到达s。

problem3 link

每一段解码选择的区间为[L,R],那么设[L,R-1]之间的数字为num,R位置的字符为letter。这个可以表示为二元组{num,letter}。这里L位置的字符一定不能是0,所以num一定大于0.

对于连续的两段解码区间$[L_{1},R_{1}],[L_{2},R_{2}](R_{1}+1=L_{2})$,必须满足$R_{1} \ne R_{2}$

对于某一段{num,letter},假设是{6,3},第一次解码之后是333333。那么第二次解码有可能是一下几种情况:

(1)当前段所有数字,即333333作为后面一段数字的num出现,比如假设后面是两个4,即33333344,那么下一次解码可能是$\underset{3333334}{\underbrace{44........44}}$

(2)当前段的前几个3作为下一次解码的某一段的num,后面的一个3是letter,再后面的剩余的3作为下一次解码的number出现,比如前面有两个6,后年有两个4,即66633333344,下一次解码可能是

$\underset{66}{\underbrace{33........33}}\underset{33333}{\underbrace{44........44}}$ 前面必须有未使用完的数字作为num

$\underset{663}{\underbrace{33........33}}\underset{3333}{\underbrace{44........44}}$ 当前段还有数字作为后面的(即44)的num

$\underset{6633}{\underbrace{33........33}}\underset{333}{\underbrace{44........44}}$ 当前段还有数字作为后面的(即44)的num

$\underset{66333}{\underbrace{33........33}}\underset{33}{\underbrace{44........44}}$ 当前段还有数字作为后面的(即44)的num

$\underset{663333}{\underbrace{33........33}}\underset{3}{\underbrace{44........44}}$ 当前段还有数字作为后面的(即44)的num

$\underset{6633333}{\underbrace{33........33}}\underset{4}{\underbrace{44........44}}$ 当前段没有数字作为后面的(即44)的num

所以动态规划的状态需要保留两个信息:第一个,前一段第二次解码的letter是什么;第二,前面是否还有未使用的数字作为当前段的num。

code for problem1

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class InternetSecurity { public String[] determineWebsite(String[] address, String[] keyword, String[] dangerous, int threshold) {
final int n = address.length;
List<List<String>> keys = new ArrayList<>();
for (int i = 0; i < n; ++ i) {
List<String> list = new ArrayList<>();
String[] p = keyword[i].split("\\W+");
for (String s : p) {
String t = s.trim();
if (t.length() > 0) {
list.add(t);
}
}
keys.add(list);
} Set<String> allDanger = new HashSet<>(Arrays.asList(dangerous)); List<Integer> result = new ArrayList<>();
boolean flag = true;
boolean[] tag = new boolean[n];
while (flag) {
flag = false;
for (int i = 0; i < n; ++ i) {
if (tag[i]) {
continue;
}
int cnt = 0;
for (String s : keys.get(i)) {
if (allDanger.contains(s)) {
++ cnt;
if (cnt >= threshold) {
break;
}
}
}
if (cnt >= threshold) {
result.add(i);
flag = true;
tag[i] = true;
allDanger.addAll(keys.get(i));
}
}
}
Collections.sort(result);
String[] ans = new String[result.size()];
for (int i = 0; i < ans.length; ++ i) {
ans[i] = address[result.get(i)];
}
return ans;
}
}

  

code for problem2

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class NetworkSecurity { public int secureNetwork(String[] clientCable, String[] serverCable) {
final int n = clientCable.length;
final int m = serverCable[0].length();
boolean[][] g = new boolean[n + m][n + m];
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < n; ++ j) {
if (clientCable[i].charAt(j) == 'Y') {
g[i][j] =true;
}
}
for (int j = 0; j < m; ++ j) {
if (serverCable[i].charAt(j) == 'Y') {
g[i][n + j] = true;
}
}
}
for (int i = 0; i < n + m; ++ i) {
for (int j = 0; j < n + m; ++ j) {
for (int k = 0; k < n + m; ++ k) {
if (g[j][i] && g[i][k]) {
g[j][k] = true;
}
}
}
}
int result = 0;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < m; ++ j) {
if (serverCable[i].charAt(j) == 'Y') {
boolean tag = true;
for (int k = 0; k < n; ++ k) {
if (g[i][k] && g[k][n + j]) {
tag = false;
break;
}
}
if (tag) {
++ result;
}
}
}
}
return result;
}
}

  

code for problem3

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class StringDecryption {
final static int mod = 1000000009; String S = null; public int decrypt(String[] code) {
StringBuilder sb = new StringBuilder();
for (String s: code) {
sb.append(s);
}
S = sb.toString();
final int n = S.length();
long[][][] f = new long[n + 1][11][2];
f[0][10][0] = 1;
for (int i = 1; i <= n; ++ i) {
final int cur = getChar(i);
for (int j = 0; j <= i - 2; ++ j) {
//当前段为{[j+1,i-1],i}
//前一段为{[xxx,j-1],j}
if (getChar(j + 1) == 0) { //当前段个数不能有前导0
continue;
}
if (getChar(j) == cur) { //前一段跟当前段的数字不能相同
continue;
}
final long X = get(j + 1, i - 1);
for (int k = 0; k < 11; ++ k) {
for (int t = 0; t < 2; ++ t) {
if (cur == 0 && t == 0) { //当前段数字为0时 第二次解码必定是跟前一段连在一起
continue; //因为对当前段第一次解码后 全是0
}
final long val = f[j][k][t];
f[i][k][1] = (f[i][k][1] + val) % mod; //当前段直接作为开始或者是跟在前一段的开始
if (k == cur) {
continue;
}
if (cur > 0 && X > 1) {
if (t == 1) {
f[i][cur][1] = (f[i][cur][1] + val) % mod;
}
f[i][cur][1] += val * (X - 2) % mod;
f[i][cur][1] %= mod;
}
if (X > 1 || t == 1) { //最后一个数字作为结束
f[i][cur][0] = (f[i][cur][0] + val) % mod;
}
}
}
}
}
long result = f[n][getChar(n)][0];
if (result < 0) {
result += mod;
}
return (int)result;
} int getChar(int pos) {
if (pos == 0) {
return 10;
}
return S.charAt(pos - 1) - '0';
} long get(int ll, int rr) {
long result = 0;
long b = 1;
for (int i = rr; i >= ll; -- i) {
result = calMod(result + b * getChar(i));
b = calMod(b * 10);
}
return result;
} long calMod(long x) {
if (x >= mod) {
x %= mod;
if (x <= 1) {
x += mod;
}
}
return x;
}
}

  

topcoder srm 480 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. 14.ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

  2. HTTP参数污染【转】

    HTTP参数污染注入源于网站对于提交的相同的参数的不同处理方式导致. 例如: www.XX.com/a?key=ab&key=3 如果服务端返回输入key的值,可能会有 一: ab 二:3 三 ...

  3. 大数据项目(MTDAP)随想

    Spark MLlib进行example测试的时候,总是编译不通过,报少包<Spark MLlib NoClassDefFoundError: org/apache/spark/ml/param ...

  4. DW表格的简单应用 之(个人简历模板)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 一个获取本机ip地址的正则

    ifconfig|grep -oP '(?<=inet addr:)(?=(?!127\.0\.0\.1))\d+(\.\d+){3}'

  6. caffe中关于(ReLU层,Dropout层,BatchNorm层,Scale层)输入输出层一致的问题

    在卷积神经网络中.常见到的激活函数有Relu层 layer { name: "relu1" type: "ReLU" bottom: "pool1&q ...

  7. notepad去掉空行

    选择替换,把查找模式设置为正则表达式,在查找框中自己输入 ^\s+  ,替换框留空,点“全部替换”,即可(先全选).注意:不要复制我的,自己输入,且用英文格式输入.

  8. 08 集合[11,22,33,44,55,66,77,88,99],将所有<66的值保存至字典的第一个key中,将所有>=66的值保存至字典的第二个key中。即:{'k1':<66的所有值,'k2':>=66的所有值}

    li = [11,22,33,44,55,66,77,88,99]dict = {'k1':[],'k2':[]}for i in li:    if i < 66:        dict[& ...

  9. NSThread(II)

    非线程安全 //初始化火车票数量.卖票窗口(非线程安全).并开始卖票 - (void)initTicketStatusNotSave { // 1. 设置剩余火车票为 50 self.ticketSu ...

  10. 城市里的间谍B901

    城市里的间谍   城市里的间谍 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 某城市的地铁是线性的,有 n(2 <= n ...