problem1 link

计算每个格子向上的最大高度。然后每个格子同一行前面的格子以及当前格子作为选取的矩形的最后一行,计算面积并更新答案。

problem2 link

对于两个数据$(x_{1},y_{1}),(x_{2},y_{2})$,若先完成第一个再完成第二个,那么一开始的值$F$需要满足$F\geq max(x_{1}, x_{2}+(x_{1}-y_{1}))$,反过来需要满足$F\geq max(x_{2}, x_{1}+(x_{2}-y_{2}))$。所以若前者更优的话,那么有$max(x_{1}, x_{2}+(x_{1}-y_{1}))<max(x_{2}, x_{1}+(x_{2}-y_{2}))$

由于$x_{1}>y_{1}, x_{2}>y_{2}$,所以等价于$y_{1}<y_{2}$。所以按照$y$升序排序,然后从前向后dp即可。

problem3 link

最后最优值跟$x$的函数关系是多个线段,且这些线段是一个凸函数。如下图的棕色线所示。从后向前扩展每个点。每次扩展相当于把之前的折线从最高处垂直分开然后向两边平移一段距离,然后加上当前点的代价。

code for problem1

#include <string>
#include <vector> class TheMatrix {
public:
int MaxArea(const std::vector<std::string> &board) {
int n = static_cast<int>(board.size());
int m = static_cast<int>(board[0].size());
std::vector<std::vector<int>> h(n, std::vector<int>(m));
int result = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (i == 0 || board[i][j] == board[i - 1][j]) {
h[i][j] = 1;
} else {
h[i][j] = h[i - 1][j] + 1;
}
result = std::max(result, h[i][j]);
int min_h = h[i][j];
for (int k = j - 1; k >= 0 && board[i][k] != board[i][k + 1]; --k) {
min_h = std::min(min_h, h[i][k]);
result = std::max(result, min_h * (j - k + 1));
}
}
}
return result;
}
};

code for problem2

#include <algorithm>
#include <queue>
#include <vector> class AlbertoTheAviator {
public:
int MaximumFlights(int F, const std::vector<int> &duration,
const std::vector<int> &refuel) {
int n = static_cast<int>(duration.size());
std::vector<int> indices(n);
for (int i = 0; i < n; ++i) {
indices[i] = i;
}
std::sort(indices.begin(), indices.end(),
[&](int l, int r) { return refuel[l] > refuel[r]; });
std::vector<std::vector<int>> f(n, std::vector<int>(F + 1));
for (int i = duration[indices[n - 1]]; i <= F; ++i) {
f[n - 1][i] = 1;
}
for (int i = n - 2; i >= 0; --i) {
for (int j = 1; j <= F; ++j) {
f[i][j] = f[i + 1][j];
if (j >= duration[indices[i]]) {
f[i][j] = std::max(
f[i][j],
1 + f[i + 1][j - duration[indices[i]] + refuel[indices[i]]]);
}
}
}
return f[0][F];
}
};

code for problem3

import java.math.*;
import java.util.*; public class MiningGoldHard {
public int GetMaximumGold(int n, int m, int[] event_i, int[] event_j, int[] event_di, int[] event_dj) {
return Solve(n, event_i, event_di) + Solve(m, event_j, event_dj);
} int Solve(int N, int[] e, int[] d) {
int m = e.length;
List<Point> ends = new ArrayList<Point>();
ends.add(new Point(0, N - e[m - 1]));
ends.add(new Point(e[m - 1], N));
ends.add(new Point(N, e[m - 1]));
for (int i = m - 2; i >= 0; -- i) {
List<Point> newEnds = new ArrayList <Point>();
if (d[i] > 0) {
int low = 0;
while (low + 1 < ends.size() && ends.get(low).y < ends.get(low + 1).y) {
++low;
}
for (int j = 0; j <= low; ++ j) {
Point p = ends.get(j);
newEnds.add(new Point(p.x - d[i], p.y));
}
for (int j = low; j < ends.size(); ++ j) {
Point p = ends.get(j);
newEnds.add(new Point(p.x + d[i], p.y));
}
ends = newEnds;
}
newEnds = new ArrayList<Point>();
for (int j = 0; j < ends.size(); ++ j) {
if ((j + 1 < ends.size() && ends.get(j + 1).x < 0) || (j > 0 && ends.get(j - 1).x > N)) {
continue;
}
Point p = ends.get(j);
newEnds.add(new Point(p.x, p.y + N - Math.abs(p.x - e[i])));
if (p.x < e[i] && j + 1 < ends.size() && e[i] < ends.get(j + 1).x) {
Point q = ends.get(j + 1);
newEnds.add(new Point(e[i], N + p.y + (q.y - p.y) * (e[i] - p.x) / (q.x - p.x)));
}
}
ends = newEnds;
}
int result = 0;;
for (Point end : ends) {
if (0 <= end.x && end.x <= N) {
result = Math.max(result, (int)end.y);
}
}
return result;
} class Point {
Point(long x, long y) {
this.x = x;
this.y = y;
}
long x, y;
}
}

topcoder srm 610 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 610

    div1 250pt: 题意:100*100的01矩阵,找出来面积最大的“类似国际象棋棋盘”的子矩阵. 解法:枚举矩阵宽(水平方向)的起点和终点,然后利用尺取法来找到每个固定宽度下的最大矩阵,不断更新 ...

  7. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

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

  8. topcoder SRM 610 DIV2 TheMatrix

    题目的意思是给一个01的字符串数组,让你去求解满足棋盘条件的最大棋盘 棋盘的条件是: 相邻元素的值不能相同 此题有点像求全1的最大子矩阵,当时求全1的最大子矩阵是用直方图求解的 本题可以利用直方图求解 ...

  9. topcoder SRM 610 DIV2 DivideByZero

    题目的意思是给你一组数,然后不断的进行除法(注意是大数除以小数),然后将得到的结果加入这组数种然后继续进行除法, 直到没有新添加的数为止 此题按照提议模拟即可 注意要保持元素的不同 int Count ...

随机推荐

  1. python中关于turtle库的学习笔记

    一.基础概念 1.画布:画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置.常用的画布方法有两个:screensize()和setup(). (1)turtle.screen ...

  2. jmeter 之 if controller

    jmeter版本5.0.下面是jmeter5.0的if逻辑控制器的截图 标红字体的意思大概是,如果勾选了 下面的 interpret condition as variable expression ...

  3. 微信小程序wx.getLocation()获取经纬度及JavaScript SDK调用腾讯地图API获取某一类地址

    简介 腾讯位置服务为微信小程序提供了基础的标点能力.线和圆的绘制接口等地图组件和位置展示.地图选点等地图API位置服务能力支持,使得开发者可以自由地实现自己的微信小程序产品. 在此基础上,腾讯位置服务 ...

  4. docker镜像导入导出

    1.使用 save命令将 镜像保存为文件docker save -o  自定义文件名.tar  已存在的镜像名 2.使用load命令将镜像文件保存到本地仓库docker load -i 自定义文件名. ...

  5. NOIP2018 游记 QAQ

    写在前面: 本人初三党.NOIP前两个月不好好停课搞信竞愣是要搞文化课.于是,期中考与NOIP一起凉凉[微笑] 本人写的第一篇NOIP游记,各位大佬们随便看一看就好 Day -n 初赛71,竟然跟wx ...

  6. python编写shell脚本

    模块 os模块和shutil模块主要用于在python中执行一些Linux相关的操作,其中 os.system(command) 可以直接运行Linux命令,如os.system('ls'). 不过, ...

  7. python-迭代器与可迭代对象

    迭代器与可迭代对象 简述 迭代是数据处理的基石.扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项.这就是迭代器模式 迭代器 迭代器是这样一个对象,实现了无参数_ ...

  8. Java基础(运算符)

    Java中的运算符: 算术运算符:+  -  *  /   %    ++     -- %运算符叫取模:它就是取余的例如:43%7=1 其他的都是和数学里的运算符一样(不过在字符串中如果是两个字符串 ...

  9. 关于SimpleDateFormat安全的时间格式化线程安全问题

    想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调 ...

  10. windows10的普通用户使用Task Scheduler的问题

    在Create Task 窗口的General选项卡中,在Security options 里有几个单选项,分别是 Run only when user is logged on ,Run wheth ...