T1准确率

【题目描述】

你是一个骁勇善战、日刷百题的OIer. 今天你已经在你OJ 上提交了y 次,其中x次是正确的,这时,你的准确率是x/y.
然而,你最喜欢一个在[0; 1] 中的有理数p/q(是一个既约分数),所以你希望再进行若干次提交,使你的准确率变为p/q. 当然,由于你的实力很强,你可以随意决定进行多少次正确的提交和多少次错误的提交. 同时,你不希望把一天的时间都用在提交上,所以你想求出最少还要进行多少次提交(包括正确的和错误的),才能达到这一目标.
注意:本题中,0/1 和1/1 都是既约分数.

【输入格式】
从文件rate.in 中读入数据。
输入第一行包含一个正整数t (t <= 5 * 10 ^ 5),表示数据组数.
接下来t 行,每行4 个整数x, y, p, q (0 <= x <= y <= 10 ^ 9; 0 <= p <= q <= 10 ^ 9; y > 0; q > 0),含义如题所述.

【输出格式】
输出到文件rate.out 中。
输出t 行,每行一个整数,表示使正确率达到p/q 所需最小提交次数;若无法达到,输出-1.

【样例1 输入】
4
3 10 1 2
7 14 3 8
20 70 2 7
5 6 1 1

【样例1 输出】
4
10
0
-1

【样例1 解释】
第一组数据中,你需要进行4 次正确的提交,使准确率达到7/14,即1/2;
第二组数据中,你需要进行2 次正确的提交,8 次错误的提交,使准确率变为9/24,即3/8;
第三组数据中,你无需进行任何提交,因为你的准确率已为20/70,即2/7;
第四组数据中,在原有的提交中已有一次错误提交,准确率不可能达到1.

【样例2】
见选手目录下的rate/rate2.in 与rate/rate2.ans。

【子任务】
对于30% 的数据,t = 1;
对于另30% 的数据,t <= 1000.
以上两部分数据中,各有50% 的数据保证x, y, p, q <= 10 ^ 4.

题意很明了,然后别想偏了……

首先不要把x, y约分要不然答案肯定不对,这是挺显然的。

然后不要把这题想成数论的不定方程,虽然设完正确提交和错误提交后化简一下确实很像不定方程,然而会有负数,而且这块我有些地方还是不太懂,所以肯定不是这个做法……

实际上,这不过是一道初中不等式,只要将p, q同时扩大n倍后,满足n * p >= x && n * q >= y就行了。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter printf("\n")
#define space printf(" ")
#define Mem(a) memset(a, 0, sizeof(a))
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const int eps = 1e-;
//const int maxn = ;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) {last = ch; ch = getchar();}
while(isdigit(ch))
{
ans = ans * + ch - ''; ch = getchar();
}
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) x = -x, putchar('-');
if(x >= ) write(x / );
putchar(x % + '');
} int t; int main() //代码就这么短……
{
freopen("rate.in", "r", stdin);
freopen("rate.out", "w", stdout);
t = read();
while(t--)
{
ll a = read(), b = read(), p = read(), q = read();
if(p == q) printf("%s\n", x == y ? "" : "-1");
else if(p == ) printf("%s\n", x == ? "" : "-1");
else
{
ll n = max((x - ) / p, (y - x - ) / (q - p)) + ;
write(n * q - y); enter;
}
}
return ;
}

T2 模拟赛

【题目描述】
你很快地完成了所有的题目,并且使准确率达到了p/q,于是开始无所事事. 老师看见了,对你说:“你今天做的题够多的了,别再做了. 我们接下来k 天每天都要模拟,我这里有很多题,你去选一些题目编k 场模拟赛吧. ”老师将所有题目都编了序号,还给你了n 种出题方案(所有方案两两不同). 每种出题方案选择所有编号属于[l; r] 的题目,作为一天的试题. 现在,你需要选出k 种出题方案(一个方案只能选取一次),分别对应k 天的模拟赛. 老师非常强调复习的重要性,因此希望有一些题目每天都出现在模拟赛当中,你需要最大化每天都出现的题目的数量.

【输入格式】
从文件exam.in 中读入数据。
输入第一行包含两个正整数n; k (1 <= k <= n <= 3 * 10 ^ 5),分别为出题方案数和模拟赛天数.
接下来n 行,每行两个整数l; r (-10 ^ 9 <= l <= r <= 10 ^ 9),表示一个出题方案(保证所有方案两两不同).

【输出格式】
输出到文件exam.out 中。
输出一个非负整数,表示每天都出现的题目的数量的最大值.

【样例1 输入】
4 2
1 100
40 70
120 130
125 180

【样例1 输出】
31

【样例1 解释】
选择前两种方案,编号为[40; 70] 的题目在两种方案中均出现,共有31 道题.

【样例2 输入】
3 2
1 12
15 20
25 30

【样例2 输出】
0

【样例2 解释】
所有给出的方案互不相交,所以答案为0.

【子任务】
对10% 的数据,k = n;
对另20% 的数据,k = 2;
对另20% 的数据,1 <= k <= n <= 20;
其余5 组数据,n = 10 ^ 2, 10 ^ 3, 10 ^ 4, 10 ^ 5, 3 * 10 ^ 5.

简单来说,就是让你从给定的n个区间中找出k个区间,使这k个区间的公共部分长度最大。

很容易想到,在所选的区间中,公共部分的长度是由最大的左端点的和最小的右端点控制的。那么如果我们先把所有区间按左端点排序,然后枚举左端点,那么控制公共区间长度的就是当前的左端点和最小的右端点。因此我们只要想办法维护所选区间的右端点就行了。
O(n ^ 2)的做法是,对于每一个区间,从左端点比他小的区间中选出右端点最大的 k-1 个区间,其中右端点第k-1大的就是当前公共区间的右端点。

然后我们就可以用一个堆优化选取这个右端点的过程,把所选的区间的右端点都放到小根堆里,当堆中元素大于k个或是根的右端点比当前左端点小,就删除根,然后当枚举到第i个区间时的答案就是 q.top() - a[i].L +1,并尝试用这个更新答案。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
#include<set>
using namespace std;
#define enter printf("\n")
#define space printf(" ")
#define Mem(a) memset(a, 0, sizeof(a))
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const int eps = 1e-;
const int maxn = 3e5 + ;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) {last = ch; ch = getchar();}
while(isdigit(ch))
{
ans = ans * + ch - ''; ch = getchar();
}
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) x = -x, putchar('-');
if(x >= ) write(x / );
putchar(x % + '');
} int n, k;
struct Node
{
int L, R;
bool operator < (const Node& other)const
{
return L < other.L || (L == other.L && R < other.R);
}
}a[maxn]; struct QUE //忘了优先队列的小根堆写法……
{
int l;
bool operator < (const QUE& other)const
{
return l > other.l;
}
};
priority_queue<QUE> q;
int cnt = , ans = ; int main()
{
freopen("exam.in", "r", stdin);
freopen("exam.out", "w", stdout);
n = read(); k = read();
for(int i = ; i <= n; ++i) {a[i].L = read(); a[i].R = read();}
sort(a + , a + n + );
for(int i = ; i <= n; ++i)
{
q.push((QUE){a[i].R}); cnt++;
if(cnt > k) {q.pop(); cnt--;}
while(!q.empty() && a[i].L > q.top().l) {q.pop(); cnt--;}
if(cnt == k) ans = max(ans, q.top().l - a[i].L + );
}
write(ans); enter;
return ;
}

T3还不会呀……(小声)

【2018暑假集训模拟一】Day1题解的更多相关文章

  1. 【2018暑假集训模拟一】Day2题解

    T1 园艺工人的求助 [题目描述]终于,在一段繁忙的训练之后,到了NOIP 的举办的时候.同学们坐上了大巴车,享受着沿途的风光,讨论着未解决的问题,憧憬着NOIP 赛场上切题的样子.很快,大巴车到了大 ...

  2. 2018.7.16 题解 2018暑假集训之Roads-roads

    题面描述 有标号为1--n的城市与单行道相连.对于每条道路有两个与之相关的参数:道路的长度以及需要支付的费用(用硬币的数量表示) 鲍勃和爱丽丝曾经生活在城市1.在注意到爱丽丝在他们喜欢玩的卡牌游戏中作 ...

  3. 2018.8.17 2018暑假集训 关于dp的一些感想(以目前的知识水平)

    学了这么长时间的dp似乎还是不怎么样 谨以此篇文字记录一年以来与dp斗智斗勇的各种经历 关于dp(也就是动态规划)似乎对于每个OIer来说都是一个永远的噩梦. 刚刚开始学dp的时候完全搞不明白(只是觉 ...

  4. 2018.8.19 2018暑假集训之maxnum

    昨天去做志愿服务去了没写成Q_Q 今天再来一道 先放题面描述 设有n个正整数(n<=20),将它们联成一排,组成一个最大的多位数 设有n个正整数(n<=20),将它们联成一排,组成一个最大 ...

  5. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  6. 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)

    牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...

  7. 暑假集训Day1 整数划分

    题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...

  8. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  9. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

随机推荐

  1. 网页中通过js修改img的src属性刷新图片时,图片缓存问题现象表述及问题解决【ps:引用大神案例http://blog.csdn.net/goodleiwei/article/details/50737548】

    问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过fir ...

  2. 一.JDK版本切换批处理脚本

    我们平时在window上做开发的时候,可能需要同时开发两个甚至多个项目,有时不同的项目对JDK的版本要求有区别,这时候我们可能会在一台电脑上安装多个版本的JDK,如下图所示:

  3. Web前端基础——HTML

    一 .HTML 概述 HTML : 超文本标记语言 HyperText markup language <marquee behavior="alternate"> & ...

  4. java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.String(Short类型无法强转成String类型)

    有一行Java代码如下: String code1 = (String)qTable1.getValueAt(i, 0); 这是一个Java的图形界面获取表格中值的代码,其中qTable1.getVa ...

  5. JVM 堆内存和非堆内存

    转载自:http://www.importnew.com/27645.html 堆和非堆内存 按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此 ...

  6. Java static和final

    java提高篇(七)-----关键字static static 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静 ...

  7. 几个常用T_SQL语句比较

    UNION ALL VS UNION : union all 对两个结果进行并集操作,包括重复行,即所有的结果全部显示,不管是不是重复:union 对两个结果集进行并集操作,不包括重复行,相当于 di ...

  8. @ModelAttribute注解详解

    @ModelAttribute注解详解 1.@ModelAttribute定义: 被该注解定义的方法,会在该方法所在的controller的任何目标方法执行之前执行 2.@ModelAttribute ...

  9. POJO、JAVABEAN、*O、EJB

    POJO: 全称:Plain Old Java Object 解释:纯洁老式的java对象.从任何类继承.也没有实现任何接口,更没有被其它框架侵入的java对象 理解:通常我们常说的实体类 BEAN: ...

  10. js弹窗 js弹出DIV,并使整个页面背景变暗

    1.首先写一个遮罩层div,然后再写一个弹窗的div <!-- 遮罩层 --> <div id="cover" style="background: # ...