topcoder srm 600 div1
problem1 link
首先,如果一个数字的某一位是1但是$goal$的这一位不是1,那么这个数字是不用管它的。那么对于剩下的数字,只需要统计在$goal$为1的位上,这些数字对应位上也是1的数字个数。所有这样的位取最小值即可。这些数字就是要都被删除的。
problem2 link
首先暴力枚举哪些行是最后回文的行。然后对于列来说,将其对称折叠成$\frac{m}{2}$列,每一列可以选择0、1、2个,最后选出$columnCount$列。这个可以动态规划。
problem3 link
考虑一条线一条线添加进去。
每次添加一条线所增加的区域等于1加上这条线与已有的线交点的个数。如果多个线交于一点那么这个点只能算一次。
对于一条线$y=ax+b$,只需要考虑以下这些直线:$y=a^{'}x+b^{'},0\leq a^{'}<a,0\leq b^{'}<B$
交点为横坐标为$x=\frac{b^{'}-b}{a-a^{'}}=\frac{p}{q},-b\leq p<B-b,1\leq q\leq a$
可以将$p$分为三段:$-b\leq p<0,p=0,0<p<B-b$
如果当前直线与之前的两条线相交于一点,那么有$\frac{p_{1}}{q_{1}}=\frac{p_{2}}{q_{2}}$,那么只需要考虑$p_{i},q_{i}$互质的那一组即可。由于$q$的连续性,必有一组是互质的。
令$f[a][b]=\sum_{i=1}^{a}\sum_{j=1}^{b}[Gcd(i,j)=1]$
所以答案为$f[a][b]+1+f[a][B-b-1]$表示上面分成的三段。
code for problem1
- #include <algorithm>
- #include <vector>
- class ORSolitaire {
- public:
- int getMinimum(const std::vector<int> &numbers, int goal) {
- std::vector<int> b(30);
- for (auto x : numbers) {
- if ((goal & x) == x) {
- for (int i = 0; i < 30; ++i) {
- if ((x & (1 << i)) != 0) {
- ++b[i];
- }
- }
- }
- }
- int result = -1;
- for (int i = 0; i < 30; ++i) {
- if ((goal & (1 << i)) != 0) {
- if (result == -1 || result > b[i]) {
- result = b[i];
- }
- }
- }
- return result;
- }
- };
code for problem2
- #include <string>
- #include <vector>
- class PalindromeMatrix {
- public:
- int minChange(const std::vector<std::string> &A, int rowCount,
- int columnCount) {
- int n = static_cast<int>(A.size());
- int m = static_cast<int>(A[0].size());
- int result = n * m;
- for (int mask = 0; mask < (1 << n); ++mask) {
- std::vector<int> rows;
- for (int i = 0; i < n; ++i) {
- if ((mask & (1 << i)) != 0) {
- rows.push_back(i);
- }
- }
- if (static_cast<int>(rows.size()) == rowCount) {
- result = std::min(result, Compute(rows, A, columnCount, n, m));
- }
- }
- return result;
- }
- private:
- int Compute(const std::vector<int> &rows, const std::vector<std::string> &A,
- int column, int n, int m) {
- auto Cost = [&](int c1, int c2, int tag) {
- std::vector<int> visited(n);
- std::vector<int> row_hash(n);
- for (auto r : rows) {
- row_hash[r] = 1;
- }
- int result = 0;
- for (auto r : rows) {
- if (visited[r] == 1) {
- continue;
- }
- int c[2] = {0, 0};
- visited[r] = 1;
- ++c[A[r][c1] - '0'];
- ++c[A[r][c2] - '0'];
- if (tag == 1) {
- ++c[A[n - 1 - r][c1] - '0'];
- visited[n - 1 - r] = 1;
- if (row_hash[n - 1 - r] == 1) {
- ++c[A[n - 1 - r][c2] - '0'];
- }
- } else if (tag == 2) {
- ++c[A[n - 1 - r][c2] - '0'];
- visited[n - 1 - r] = 1;
- if (row_hash[n - 1 - r] == 1) {
- ++c[A[n - 1 - r][c1] - '0'];
- }
- } else if (tag == 3) {
- ++c[A[n - 1 - r][c2] - '0'];
- ++c[A[n - 1 - r][c1] - '0'];
- visited[n - 1 - r] = 1;
- }
- result += std::min(c[0], c[1]);
- }
- for (int i = 0; i < n / 2; ++i) {
- if (visited[i] == 0) {
- if ((tag & 1) == 1 && A[i][c1] != A[n - 1 - i][c1]) {
- ++result;
- }
- if ((tag & 2) == 2 && A[i][c2] != A[n - 1 - i][c2]) {
- ++result;
- }
- }
- }
- return result;
- };
- std::vector<std::vector<int>> f(m >> 1, std::vector<int>(column + 1, -1));
- auto Update = [&](int i, int j, int cost) {
- if (j <= column && (f[i][j] == -1 || f[i][j] > cost)) {
- f[i][j] = cost;
- }
- };
- Update(0, 0, Cost(0, m - 1, 0));
- Update(0, 1, std::min(Cost(0, m - 1, 1), Cost(0, m - 1, 2)));
- Update(0, 2, Cost(0, m - 1, 3));
- for (int i = 1; i < (m >> 1); ++i) {
- for (int j = 0; j <= column; ++j) {
- if (f[i - 1][j] == -1) {
- continue;
- }
- Update(i, j, f[i - 1][j] + Cost(i, m - 1 - i, 0));
- Update(i, j + 1, f[i - 1][j] + std::min(Cost(i, m - 1 - i, 1),
- Cost(i, m - 1 - i, 2)));
- Update(i, j + 2, f[i - 1][j] + Cost(i, m - 1 - i, 3));
- }
- }
- return f[m / 2 - 1][column];
- }
- };
code for problem3
- constexpr int kMax = 1200;
- int table[kMax][kMax];
- class LotsOfLines {
- public:
- long long countDivisions(int A, int B) {
- Initialize(A, B);
- long long result = B + 1;
- for (int a = 1; a < A; ++a) {
- for (int b = 0; b < B; ++b) {
- result += 2 + table[a][b] + table[a][B - 1 - b];
- }
- }
- return result;
- }
- private:
- void Initialize(int A, int B) {
- for (int i = 1; i < A; ++i) {
- for (int j = 1; j < B; ++j) {
- int t = Gcd(i, j) == 1 ? 1 : 0;
- table[i][j] =
- table[i - 1][j] + table[i][j - 1] - table[i - 1][j - 1] + t;
- }
- }
- }
- int Gcd(int x, int y) { return y == 0 ? x : Gcd(y, x % y); }
- };
topcoder srm 600 div1的更多相关文章
- Topcoder SRM 600 div1题解
日常TC计划正式启动! Easy(250pts): 题目大意:给你一个集合,里面一堆数,初始数为0,给你一个目标数,你可以选择集合中若干个数进行OR操作来得到目标数.问至少删去多少个数,使得你永远无法 ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 722 Div1 Problem 600 DominoTiling(简单插头DP)
题意 给定一个$12*12$的矩阵,每个元素是'.'或'X'.现在要求$1*2$的骨牌铺满整个矩阵, 'X'处不能放置骨牌.求方案数. 这道题其实和 Uva11270 是差不多的,就是加了一些条件. ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
随机推荐
- Django集成Bootstrap美化后台
1.pip install bootstrap-admin 2.编辑项目下的settings.py,增加下面行,放在最前面 3.编辑项目下的settings.py,增加下面行
- 第二单元电梯调度作业 By Wazaki
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
- ionic3 添加多个自定义组件
往往我们创建自定义组件一般都不止只会创建一个自定义组件,创建多个方式如下. 1.创建自定义组件 ionic g component select-car-no ionic g component ae ...
- esp32固件烧录
正常使用IO0置空即可.烧录时需要en引脚接高电平,IO0接地,使用乐鑫的烧录工具烧录即可.注意如果启用wifi,供电一定要不小于500ma,普通的usb转ttl模块无法满足wifi启动的,被坑的好惨 ...
- Objects First with Java 读书笔记 (1)
umm...这学期被发了助教Java的任务,为了避免误人子弟从零开始现学.课是英语教学,就不逐字翻译了,方便记. 参考书目:Objects First with Java - A Practical ...
- .net中使用 道格拉斯-普特 抽希轨迹点
Douglas一Peukcer算法由D.Douglas和T.Peueker于1973年提出,简称D一P算法,是目前公认的线状要素化简经典算法.现有的线化简算法中,有相当一部分都是在该算法基础上进行改进 ...
- jquery-ui sortable 在拖动换位置时改变元素的大小导致占位与实际不一致
使用jquery ui sortable时 需求是在拖动的时候要隐藏一部分元素,然后按照隐藏后的元素高度换位, 解决方案是修改源码jquery-ui.js, _mouseStart方法中开头增加 if ...
- btcpool之BlockMaker
一.简介 BlockServer将StratumServer发送的solvedshare数据(块头和coinbase交易)与GbtMaker发送的rawgbt数据(其他交易)一起组装成一个块,然后通过 ...
- 关于网站的一些js和css常见问题的记录
1. 文字超过宽度,给这个后面超过的文字用...来表示 white-space: nowrap;
- windows----------windows10如何固定局域网ip
1. 2. 3. 4. 5.