srm 539

250


Description:

从若干个盒子中任意选择几个装石头,每个盒子容量都有上下限,一旦选择使用某个盒子,那么填装的石头数必须在该盒子的上下限容量之间。假设最终填装的石头总数为x,那么符合条件x>9000的x有多少个?

数据规模:盒子总数[1,15], 盒子容量[1,106]

Solution

盒子总数15很容易想到枚举状态,把每个的上下限存一下,排个序统计一下答案即可。

Code

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
const int M = 9000;
vector<pii> a;
class Over9000Rocks {
    public:
        int countPossibilities(vector <int> lowerBound, vector <int> upperBound) {
            int n = lowerBound.size();
            for (int i = 0; i < 1 << n; ++i) {
                int l = 0, r = 0;
                for (int j = 0; j < n; ++j) {
                    if (i >> j & 1) {
                        l += lowerBound[j];
                        r += upperBound[j];
                    }
                }
                l = max(l, M + 1);
                if (l <= r) a.pb(mp(l, r));
            }
            sort(a.begin(), a.end());
            int R = 0, ans = 0;
            for (int i = 0; i < a.size(); ++i) {
                if (a[i].F > R) ans += a[i].S - a[i].F + 1;
                else if (a[i].S > R)    ans += a[i].S - R;
                R = max(R, a[i].S);
            }
            return ans;
        }
};

550


Description

目大意:给定一张图,有T个点,现在有 n 个人要从0号点分别走到 1 ~ n 号点,每个人都是沿着自己最短路径走(有多条最短路径则可任意选一条)。如果在到达终点之前,有个人单独行动,则认为这个人是处在危险中的(只有一个人经过某条边)。问n个人该怎么走使得处在危险中的人数最少。

Solution

可以想到,如果一个人的是安全的话那么他的最短路径一定可以被另一个人完全覆盖,这样我们把相互可以覆盖的建个图,求匹配即是答案。

Code

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
const int N = 55;
int d[N][N], f[N][N], l[N];
bool vis[N];
bool find(int u, int n) {
    for (int i = 1; i <= n; ++i) {
        if (f[u][i] && !vis[i]) {
            vis[i] = 1;
            if (!l[i] || find(l[i], n)) {
                l[i] = u;
                return 1;
            }
        }
    }
    return 0;
}
class SafeReturn {
    public:
        int minRisk(int T, vector <string> streets) {
            int n = streets.size();
            memset(d, 63, sizeof(d));
            for (int i = 0; i < n; ++i)
                for (int j = 0; j < n; ++j)
                    if (streets[i][j] != ‘-‘)   d[i][j] = streets[i][j] - ‘0‘;
            for (int i = 0; i < n; ++i) d[i][i] = 0;
            for (int k = 0; k < n; ++k)
                for (int i = 0; i < n; ++i)
                    for (int j = 0; j < n; ++j)
                        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            for (int i = 1; i <= T; ++i)
                for (int j = 1; j <= T; ++j)
                    if (i != j && d[0][j] + d[j][i] == d[0][i]) f[i][j] = 1;
            int ans = T;
            for (int i = 1; i <= T; ++i) {
                memset(vis, 0, sizeof(vis));
                if (find(i, T)) --ans;
            }
            return ans;
        }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 11:45:06

srm 539的相关文章

汕头市队赛 SRM 09 A 撕书

A 撕书I-3 SRM 09 背景&&描述 琉璃在撕书.     书总共有n页,都悬浮在数轴上,第i页的位置为,上面写着一个数字.     琉璃从右往左撕书.假如看到了第i页,就把在第i页左边,且与之距离<=的书都撕掉.(第i页本身不撕)     夜子为了尽量地保全魔法书,决定偷偷在琉璃开始撕之前,增加一页.增加的这一页必须在所有书页的右边,数字随意.     夜子想知道,最少会有多少页书被撕毁. 输入格式 第一行一个整数n,表示书页数. 接下来n行,第i行的俩整数分别为和. 输出格

汕头市队赛 SRM 09 B 撕书

B 撕书II-3 SRM 09 背景&&描述 琉璃手头有一黑一白两本魔法书,一本是<缟玛瑙的不在证明>,另一本是<白色相簿1.5>     传说同时打开这两本书会有奇怪的事情发生.     琉璃打开一看,果然非常奇怪:两本书上都各自写着一个正整数(可能他买到盗版了),分别是a和b.     试图撕书的汀想借过来看看,但琉璃只告诉了他这俩数加起来的值x和异或起来的值y.     汀发现有很多种(a,b)满足琉璃告诉他的信息...你能帮他算出来有多少种吗? 输入格式 两

TopCoder SRM 625 Incrementing Sequence 题解

本题就是给出一个数k和一个数组,包括N个元素,通过每次增加数组中的一个数的操作,最后需要得到1 - N的一个序列,不用排序. 可以从暴力法入手,然后优化. 这里利用hash表进行优化,最终得到时间效率是O(n*n)的算法,而且常数项应该很低,速度还挺快的. 思路: 1 如果数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了: 2 如果A[i]的值之前已经找到了,那么就增加k操作,得到新的值A[i]+k,看这个值是否找到了,如果没找到,就使用B记录,如果之前已经找到了,那

汕头市队赛 SRM 06 C 秀恩爱

C 秀恩爱 SRM 06 背景&&描述 KPM坐在直升机上俯瞰小渔村景象. 渔村可看作二维平面,密密麻麻地到处都是单身狗,KPM当前所在坐标为(sx,sy). KPM的后宫团们自发地聚集在一起为他送行,从空中看,后宫团形成了一个多边形. 当然了KPM是不在那个多边形内的. 直升机突然开始原地转圈,后宫团们因为想看着KPM的正脸,所以也跟着以KPM所在坐标为中心旋转. 后宫团所经之处单身狗尸横遍野.赶来救治伤员的医护人员想知道,多边形扫过的面积是多少. 注意,本题不保证横坐标互不相同.纵坐标

[TC SRM 697 div1 lev1] DivisibleSetDiv1

Tutorial:https://apps.topcoder.com/wiki/display/tc/SRM+697#DivisibleSetDiv1 Note:证明过程值得一看. 主要内容:寻找[x1,x2,...,xn]使得满足bi * xi >= S - xi,其中S = x1 + x2 + ... + xn.

Topcoder SRM 刷题企划

1.本文用来记录自己在Topcoder上刷过的题目.不过重点是记录心得,记录自己的思路问题. 2.刷的题目全部都是Div2 1000分的题目,小概率会去做Div1 的进阶题. 3.基本上自己写出来的题目都不会另开一篇来写. 4.Topcoder使用: [教程1][教程2] SRM 508 Div2 YetAnotherORProblem (Div2 Hard) 题意:构造长度为N,各元素上限为R的序列,并且满足$A_1+A_2+\cdots+A_n=A_1|A_2|\cdots|A_n$,求方案

高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯

高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk  539. 牛棚的灯 ★★☆   输入文件:lights.in   输出文件:lights.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 贝希和她的闺密们在她们的牛棚中玩游戏.但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了.贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊

SRM 513 2 1000CutTheNumbers(状态压缩)

SRM 513 2 1000CutTheNumbers Problem Statement Manao has a board filled with digits represented as String[] board. The j-th character of the i-th element of board represents the digit written in cell in row i, column j of the board. The rows are numbe

UVa 539 卡坦岛

题意:某游戏的玩家会建造一些公路,公路是连接两个岛的,这样形成一个图.顶点是岛,边是公路,且边长均为1.要求每条边只能走一遍,这样最长的公路是多长. 思路:回溯法.以所有的点都开始枚举一次.由于这里每条边只能访问一次,而顶点是可以访问多次的,所以不能简单地用vis[26]数组来判断,而是用g[][]的值来表示边的条数,这样,输入时边的相应g值++,选择一条边时,则相应g值--.这样没要输出路径,所以连路径都没有保存,直接修改g值就可以了.但不要忘了,dfs之后还需要恢复g值,dfs下面相当于不选