Codeforces_Round_#241_DIV2_ABC

来源:互联网 发布:adas哪个软件好 编辑:程序博客网 时间:2024/06/14 16:23

A. Guess a number!

题目链接

http://codeforces.com/contest/416/problem/A


模拟(特别恶心的模拟!)

题目意思是说给你一个正整数n(1~10000)

然后接下来n行给你每行的规格是这样的:

                 > ( 或者 < 或者 >= 或者 <= )      x (一个整数范围为(-1e~1e))      Y(或者N)


意思是某个数  y(-2e~2e)是否 > x (其他符号同理) 最后字符是Y代表成立 N就代表不成立

然后问你是否存在一个数y符合以上n行规则

如果有

任意输出 一个符合规则的数

如果没

有输出 Impossible


思路

其实想明白了 然后脑子比较清醒很容易就过了 如果乱了那就完蛋了

我们来列个表

我们把所有 > 和 < 的情况转化成 >= 和 <=的 情况



根据这个表 我们可以对所有的规则分成八种不同的规则 然后分别求解

接下来我们就只要记录>=和<=两种情况的极限然后根据极限的关系我们就可以知道在该区间里是否有y存在

如果区间有值那么就可以随便输出一个符合条件的值 如果没有值那么就直接输出Impossible就好


ac代码

http://paste.ubuntu.com/7245067/


B. Art Union

题目链接

http://codeforces.com/contest/416/problem/B


DP?模拟?

题目意思是说总共有m张画n种颜色 每张画都包含n种颜色

然后有n个画家(每个画家只画一种相同的颜色)

我们可以假设第一个人画第一种颜色, 第二个人画第二个颜色。。。

他们流水线画画

顺序是

每张画都是由第一个人开始先画 然后接着第二个人画 第三个人画。。。。

每个人都是从第一张话开始画 然后再画第二张 第三张。。。

每个人画完当前画时可以理解画下一张画中间没有时间间隔

当画完所有人时画就可以出售


问你所有的画都画完最少要多久?


输入

integers m, n (1 ≤ m ≤ 50000, 1 ≤ n ≤ 5)

然后给你m行 n列的数字

表示第m_i副画需要第n_i画家多久的时间 t   integers(1 ≤ ≤ 1000)


输出

m个数字 m_i 代表画完第i副画所需最短时间


思路

想了一会

我们用一个二维数组 int a[m][n] 来存对应的时间

用一个二维数组 long long dp[m][n] 来存当第m_i副画被n_i的画家画完所需的最短时间

我们发现对于第一个人的画画 所画的每幅画都是 当前画所需时间+之前画画所需的所有时间 有

    dp[0][0] = a[0][0];    for ( int i = 1; i < m; i ++){        dp[i][0] = a[i][0] + dp[i - 1][0];    }

然后对于第一幅画 每个人画完所需的时间都是 前一个人所画时间 + 自己所画时间 有

    for ( int i = 1; i < n; i ++){        dp[0][i] = a[0][i] + dp[0][i - 1];    }

然后从第二个人画第二幅画开始时 第每个人画完当前画所需的时间一定是 max(自己画完第前一幅画所用时间,前一人画完当前画所用时间) + 自己画完当前画所用时间有

    for ( int i = 1; i < n; i ++){        for ( int j = 1; j < m; j ++){            dp[j][i] = a[j][i] + max( dp[j - 1][i], dp[j][i - 1]);        }    }

那么每张画所画完所用时间就是dp[i][n - 1]


ac代码

http://paste.ubuntu.com/7245212/



C. Booking System

题目链接

http://codeforces.com/contest/416/problem/C


贪心

题目意思是说有n组(有序)客人 每组客人有c个人和会支付p的金额

有k个(有序)桌子可以接待客人 每个桌子能够容纳不同人数的客人

但是只有桌子能够容纳该组客人的人数 客人才支付金额否则不会支付

而且每个桌子只招待一组客人 客人也只会消费一次 然后离开

问怎样能够使收益最大


输出为integers: m, s

m代表有几组客人支付了 s代表所有金额的总和

然后接下来是m行

每行输出第几组客人 坐在第几号桌子


比赛结束以后才想到

我们记录下客人的人数,支付金额和初始位置 对金额进行从大到小排序

然后记录下桌子的初始位置和所能容纳人的个数 然后对容纳个数从小到大排序

然后从桌子能够容纳人数最小的一段开始 每次用容纳人数和客人的人数从金额大的一端进行扫描

找到能够容纳的记录下来 这样就能保证用最少容纳人数桌子放对应的支付金额大的客人


ac代码

http://paste.ubuntu.com/7245323/

(PS 表示这个代码写的非常非常渣因为太饿了了然后想写完立马出去吃饭 结果写完交了wa在最后一组数据了 然后忍不了就出去吃饭去了

路上想到其实没有考虑到对桌子排序回来又重新改的乱七八糟。。各位见谅。。。)


0 0
原创粉丝点击