problem1 link

每次贪心地从crans由大到小地找到一个能搬得动地尽量大地box即可。

problem2 link

首先,$hava$可以全部换成钱,然后就是找到一个最小的钱减去自己已有的钱即可。

直接枚举所有的组合是会超时的,因为有$2^{n}$。可以分成两部分,各有一半,枚举出所有情况,记录$(SumPrice,SumValue)$。然后遍历前一半的所有情况,在后一半中搜索大于等于$K-SumValue$的组合中最小的$SumPrice$是多少。

problem3 link

首先,可以先得出所有的$forbidden$情况。令$m$为$forbidden$串的长度。

在构造一个长度为$wordLength$的串时要其合法,只需要每次最后长度为$m$的后缀不在$forbidden$集合里面即可。这样的话,可以用$f[n][mask]$表示已经构造了长度为$n$的串,最后的长度为$m-1$的suffix状态为$mask$的合法串的数量。

有了$f$数组,就可以构造出第$K$个合法串(假设下标从1开始)。比如$f[0][0] \geq K$时第一个字符就是'A';否则就是'B',然后K=K-f[0][0],继续判断下一个字符。

code for problem1

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class ShipLoading { public int minimumTime(int[] cranes, String[] boxes) {
List<Integer> list=new ArrayList<>();
StringBuilder sb=new StringBuilder();
for(int i=0;i<boxes.length;++i) {
sb.append(boxes[i]);
}
String[] a=sb.toString().split("\\W+");
for(String s:a) {
if(s.trim().length()>0) {
list.add(Integer.valueOf(s.trim()));
}
} Collections.sort(list);
if(list.size()==0) {
return 0;
}
Arrays.sort(cranes);
if(list.get(list.size()-1)>cranes[cranes.length-1]) {
return -1;
} int num=0;
int result=0; while(num<list.size()) {
++result;
for(int j=cranes.length-1;j>=0;--j) {
num+=get(list,cranes[j]);
}
}
return result;
}
int get(List<Integer> list,int k) {
for(int i=list.size()-1;i>=0;--i) {
if(list.get(i)!=-1&&list.get(i)<=k) {
list.set(i,-1);
return 1;
}
}
return 0;
}
}

  

code for problem2

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class CollectingPostmarks { static class pair {
public long first;
public long second; public pair() {}
public pair(long x,long y) {
first=x;
second=y;
}
} static class MyComparator implements Comparator<pair> {
public int compare(pair a,pair b) {
if(a.second!=b.second) {
return a.second<b.second?-1:1;
}
if(a.first==b.first) {
return 0;
}
return a.first<b.first?-1:1;
}
} public int amountOfMoney(int[] prices, int[] have, int[] values, int K) { if(K==0) {
return 0;
} final int n=prices.length;
final int m=have.length;
long sum1=0,sum2=0,sum0=0;
for(int i=0;i<n;++i) {
sum1+=values[i];
sum0+=prices[i];
}
for(int i=0;i<m;++i) {
sum2+=prices[have[i]];
}
if(sum1<K) {
return -1;
}
if(n==1) {
if(sum0<sum2) {
return 0;
}
return (int)(sum0-sum2);
} int[] p1=new int[n>>1];
int[] v1=new int[n>>1];
int[] p2=new int[n-p1.length];
int[] v2=new int[n-p1.length];
for(int i=0;i<n;++i) {
if(i<p1.length) {
p1[i]=prices[i];
v1[i]=values[i];
}
else {
p2[i-p1.length]=prices[i];
v2[i-p1.length]=values[i];
}
}
List<pair> l1=cal(p1,v1);
List<pair> l2=cal(p2,v2);
Collections.sort(l1,new MyComparator());
Collections.sort(l2,new MyComparator());
long minPrice=1l<<50;
for(int i=l2.size()-1;i>=0;--i) {
if(minPrice<l2.get(i).first){
l2.get(i).first=minPrice;
}
else {
minPrice=l2.get(i).first;
}
} long minCost=1l<<50;
for(int i=0;i<l1.size();++i) {
pair t=l1.get(i);
if(t.second>=K) {
minCost=Math.min(minCost,t.first);
continue;
}
minCost=Math.min(minCost,t.first+get(l2,K-t.second));
} if(sum2>minCost) {
return 0;
}
return (int)(minCost-sum2);
} long get(List<pair> list,long K) {
final int n=list.size();
if(list.get(n-1).second<K) {
return 1l<<50;
}
if(K<=list.get(0).second) {
return list.get(0).first;
}
int low=0,high=n-1;
int result=n-1;
while(low<=high) {
int mid=(low+high)>>1;
if(list.get(mid).second>=K) {
result=Math.min(result,mid);
high=mid-1;
}
else {
low=mid+1;
}
}
return list.get(result).first;
} List<pair> cal(int[] p,int[] v) {
final int n=p.length;
List<pair> list=new ArrayList<>();
for(int i=0;i<(1<<n);++i) {
pair t=new pair();
t.first=t.second=0;
for(int j=0;j<n;++j) {
if((i&(1<<j))!=0) {
t.first+=p[j];
t.second+=v[j];
}
}
list.add(t);
}
return list;
}
}

  

code for problem3

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class AlienDictionary { static final int INF=1000000005; boolean[] forbidden=new boolean[1<<17];
int n,m;
int[][] f=new int[52][1<<16]; public String[] getWords(int wordLength, String[] forbiddenSubstrings, int[] wordNumbers) {
this.n=wordLength;
if(forbiddenSubstrings.length>0) {
this.m=forbiddenSubstrings[0].length();
}
else {
m=1;
}
for(int i=0;i<forbiddenSubstrings.length;++i) {
dfs(0,0,forbiddenSubstrings[i]);
}
for(int i=0;i<n;++i) {
for(int j=0;j<(1<<(m-1));++j) {
f[i][j]=-1;
}
}
String[] result=new String[wordNumbers.length];
for(int i=0;i<wordNumbers.length;++i) {
int k=wordNumbers[i];
if(cal(0,0)<=k) {
result[i]=new String("NO PAGE");
continue;
}
StringBuilder sb=new StringBuilder();
int suffixMask=0;
for(int id=0;id<n;++id) {
suffixMask&=(1<<(m-1))-1;
if(cal(id+1,suffixMask<<1)>k) {
sb.append('A');
suffixMask=suffixMask<<1;
}
else {
sb.append('B');
k-=cal(id+1,suffixMask<<1);
suffixMask=suffixMask<<1|1;
}
}
result[i]=sb.toString();
}
return result;
} int cal(int pos,int mask) {
if(pos>=m&&forbidden[mask]) {
return 0;
}
if(pos==n) {
return 1;
} mask&=(1<<(m-1))-1; if(f[pos][mask]!=-1) {
return f[pos][mask];
}
final int mask1=mask&((1<<(m-1))-1);
int result=cal(pos+1,mask1<<1)+cal(pos+1,mask1<<1|1);
if(result>INF) {
result=INF;
}
return f[pos][mask]=result;
} void dfs(int dep,int mask,String s) {
if(dep==s.length()) {
forbidden[mask]=true;
return;
}
if(s.charAt(dep)!='B') {
dfs(dep+1,mask<<1,s);
}
if(s.charAt(dep)!='A') {
dfs(dep+1,mask<<1|1,s);
}
}
}

  

topcoder srm 415 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. LocalStorage存储和cookie存储

    localStorage是H5的新特性,主要用来本地存储,一般浏览器支持的大小是5M,不同浏览器会有所不同,解决了cookie存储空间不足的问题. 2.使用:     ⑴.存 if(!window.l ...

  2. 第二章 CSS基本属性

    1.CSS:层叠样式表 一个元素允许同时应用多种样式,页面元素最终的样式即为多种样式的叠加效果. 2.CSS样式优先级 行内样式表>内部样式表>外部样式表[就近原则] id选择器>类 ...

  3. big and little endian

    总是容易搞混big endian 和 little endian,但是找到一篇文章,其解释让人耳目一新. 文章链接:http://www.cs.umd.edu/class/sum2003/cmsc31 ...

  4. sql2008升级到r2提示:检查当前是否正确配置了报表服务器、数据库服务器是否正在运行以及您是否有权访问

    sql2008升级到r2提示:检查当前是否正确配置了报表服务器.数据库服务器是否正在运行以及您是否有权访问 解决方法:把服务开启ok

  5. Mysql常规优化

    一.SQL语句优化 (1)使用limit对查询结果的记录进行限定(2)避免select *,将需要查找的字段列出来(3)使用连接(join)来代替子查询(4)拆分大的delete或insert语句 二 ...

  6. Yii Listview

  7. uva 1322 Minimizing Maximizer

    题意: 有n个数,m个排序器,每个排序器可以把区间ai到bi的数从小到大排序.这m个排序器的输出就是m个排序之后的第n个数. 现在发现有些排序器是多余的.问至少需要多少个排序器可以使得输出不变.排序器 ...

  8. 【Hbase学习之二】Hbase 搭建

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 hbase-2.1.3 一.单机模 ...

  9. 设计模式之Decorator(油漆工)(转)

    Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...

  10. flask 在模板中渲染表单

    在模板中渲染表单 为了能够在模板中渲染表单,我们需要把表单类实例传入模板.首先在视图函数里实例化表单类LoginForm,然后再render_template()函数中使用关键脑子参数form将表单实 ...