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. 深入理解.NET MemoryCache

    摘要 MemoryCache是.Net Framework 4.0开始提供的内存缓存类,使用该类型可以方便的在程序内部缓存数据并对于数据的有效性进行方便的管理,借助该类型可以实现ASP.NET中常用的 ...

  2. [日常] Go语言圣经-匿名函数习题

    Go语言圣经-匿名函数1.拥有函数名的函数只能在包级语法块中被声明,通过函数字面量(function literal),我们可绕过这一限制,在任何表达式中表示一个函数值2.通过这种方式定义的函数可以访 ...

  3. Java多线程--锁的优化

    Java多线程--锁的优化 提高锁的性能 减少锁的持有时间 一个线程如果持有锁太长时间,其他线程就必须等待相应的时间,如果有多个线程都在等待该资源,整体性能必然下降.所有有必要减少单个线程持有锁的时间 ...

  4. css 给inline和inline-block元素设置margin和padding

    经过简单的测试,行内元素或者行内块元素的maring-left,margin-right,padding-left,padding-right都是可以正常表现的,下面来看一下剩下的margin-top ...

  5. IntelliJ idea 备份与恢复

    为了防止突然断电或者电脑突然关机导致idea恢复出厂设置,需要定期备份配置. 一.备份 File---Export Settings 将settings.jar 文件导入到C:\Users\xutin ...

  6. Fedora16的双显卡切换问题

    症状:笔记本是Acer 4745G,安装了Fedora16+Win7 x64的双系统,每次开机后,独立显卡的风扇就开始狂转,同时笔记本的发热量极大,左侧出风口简直烫手.... 问题:Acer 4745 ...

  7. readlink 命令

    在Linux中readlink命令的作用是:输出符号链接值或权威文件名(通常使用的是-f参数) 格式:readlink [选项]... 文件 参数:   -f, --canonicalize 递归跟随 ...

  8. springboot 学习之路 15(集成shiro)

    shiro: Apache Shiro 是 Java 的一个安全框架.功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案.   更多shiro介 ...

  9. Prometheus Node_exporter 之 Disk Datail /proc/diskstats

    Disk Datail /proc/diskstats 1. Disk IOps Completed type: GraphUnit: I/O ops/sec(iops)Label: IO read( ...

  10. 七牛云A账号数据迁移到B账号下

    1,七牛云A账号下开启空间授权,可以让B账号可以访问A账号下的空间,,授予权限只读即可. 2,下载七牛云命令行工具.(通过命令完成数据迁移) https://dn-devtools.qbox.me/2 ...