Java实现 蓝桥杯 算法训练 Beaver's Calculator
试题 算法训练 Beaver’s Calculator
问题描述
从万能词典来的聪明的海狸已经使我们惊讶了一次。他开发了一种新的计算器,他将此命名为"Beaver’s Calculator 1.0"。它非常特别,并且被计划使用在各种各样的科学问题中。
为了测试它,聪明的海狸邀请了n位科学家,编号从1到n。第i位科学家给这个计算器带来了 ki个计算题。第i个科学家带来的问题编号1到n,并且它们必须按照编号一个一个计算,因为对于每个问题的计算都必须依赖前一个问题的计算结果。
每个教授的每个问题都用一个数 ai, j 来描述,i(1≤i≤n)是科学家的编号,j(1≤j≤ ki )是问题的编号, ai, j 表示解决这个问题所需资源单位的数量。
这个计算器非常不凡。它一个接一个的解决问题。在一个问题解决后,并且在下一个问题被计算前,计算器分配或解放资源。
计算器中最昂贵的操作是解放资源,解放远远慢于分配。所以对计算器而言,每一个接下来的问题所需的资源不少于前一个,是非常重要的。
给你关于这些科学家所给问题的相关信息。你需要给这些问题安排一个顺序,使得“坏对”尽可能少。
所谓“坏对”,就是相邻两个问题中,后一个问题需求的资源比前一个问题少。别忘了,对于同一个科学家给出的问题,计算它们的相对顺序必须是固定的。
输入格式
第一行包含一个整数n,表示科学家的人数。接下来n行每行有5个整数,ki, ai, 1, xi, yi, mi (0 ≤ ai, 1 < mi ≤ 109, 1 ≤ xi, yi ≤ 109) ,分别表示第i个科学家的问题个数,第1个问题所需资源单位数,以及3个用来计算 ai, j 的参量。ai, j = (ai, j - 1 * xi + yi)mod mi。
输出格式
第一行输出一个整数,表示最优顺序下最少的“坏对”个数。
如果问题的总个数不超过200000,接下来输出 行,表示解决问题的最优顺序。每一行两个用空格隔开的整数,表示这个问题所需的资源单位数和提供这个问题的科学家的编号。
样例输入
2
2 1 1 1 10
2 3 1 1 10
样例输出
0
1 1
2 1
3 2
4 2
数据规模和约定
20%的数据 n = 2, 1 ≤ ki ≤ 2000;
另外30%的数据 n = 2, 1 ≤ ki ≤ 200000;
剩下50%的数据 1 ≤ n ≤ 5000, 1 ≤ ki ≤ 5000。
import java.io.*;
class Expert{
int indexOfProblem;
int numOfProblem;
long[] problem; // 存放每个问题所消耗的资源数
}
public class Main{
static Expert[] experts;
public static void merge(int start,int end,long[][] ans) {
int mid = (start+end)>>1;
int i = start;
int j = mid+1;
int k = 0;
long[][] temp = new long[end-start+1][2];
while(i <= mid && j <= end) {
if(ans[i][0] > ans[j][0]) {
temp[k][0] = ans[j][0];
temp[k++][1] = ans[j++][1];
}else {
temp[k][0] = ans[i][0];
temp[k++][1] = ans[i++][1];
}
}
while(i <= mid) {
temp[k][0] = ans[i][0];
temp[k++][1] = ans[i++][1];
}
while(j <= end) {
temp[k][0] = ans[j][0];
temp[k++][1] = ans[j++][1];
}
for( i = 0 ; i < k; i++) {
ans[i+start][0] = temp[i][0];
ans[i+start][1] = temp[i][1];
}
}
public static void mergeSort(int start,int end, long[][] ans) {
if(start < end) {
int mid = (start + end)>>1;
mergeSort(start, mid, ans);
mergeSort(mid+1, end, ans);
merge(start, end, ans);
}
}
public static void main(String[] args) throws IOException{
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
int n = (int)in.nval;
long numOfAllProblems = 0;
long maxBad = -1;
experts = new Expert[n];
for(int i = 0 ; i < n ; i++) {
experts[i] = new Expert();
}
for(int i = 0 ; i < n; i++) {
long oneBad = 0;
in.nextToken();
experts[i].numOfProblem = (int)in.nval;
numOfAllProblems += (int)in.nval;
experts[i].problem = new long[(int)in.nval+1];
experts[i].problem[0] = -1;
experts[i].indexOfProblem = 1;
long firstProblem, xi, yi, mi;
in.nextToken();
firstProblem = (long)in.nval;
in.nextToken();
xi = (long)in.nval;
in.nextToken();
yi = (long)in.nval;
in.nextToken();
mi = (long)in.nval;
experts[i].problem[1] = firstProblem;
for(int j = 2 ; j <= experts[i].numOfProblem ; j++) {
experts[i].problem[j] = (experts[i].problem[j-1] * xi + yi) % mi;
if(experts[i].problem[j] < experts[i].problem[j-1]) {
oneBad++;
}
}
if(oneBad > maxBad) {
maxBad = oneBad;
}
}
out.println(maxBad);
out.flush();
if(numOfAllProblems <= 200000) {
long[][] ans = new long[(int) numOfAllProblems][2];
int start = 0, end = 0;
while(end < numOfAllProblems) {
for(int i = 0 ; i < n; i++) {
int j;
for(j = experts[i].indexOfProblem ; j <= experts[i].numOfProblem; j++) {
if(j != experts[i].indexOfProblem && (experts[i].problem[j] < experts[i].problem[j-1])) {
experts[i].indexOfProblem = j;
break;
}
ans[end][1] = i;
ans[end++][0] = experts[i].problem[j];
}
if(j > experts[i].numOfProblem) {
experts[i].indexOfProblem = j;
}
}
mergeSort(start, end-1, ans);
start = end;
}
for(int i = 0 ; i < numOfAllProblems; i++) {
out.println(ans[i][0] + " " + (ans[i][1]+1));
out.flush();
}
}
}
}
Java实现 蓝桥杯 算法训练 Beaver's Calculator的更多相关文章
- Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...
- Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...
- java实现 蓝桥杯 算法训练 Password Suspects
问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...
- Java实现 蓝桥杯 算法训练VIP 报数(暴力+数学)约瑟夫环问题
试题 算法训练 报数 问题描述 现有n个同学站成一圈,顺时针编号1至n.从1号同学开始顺时针1/2报数,报到1的同学留在原地,报到2的同学退出圆圈,直到只剩一名同学为止.问最后剩下的同学编号. 输入格 ...
- Java实现蓝桥杯 算法训练 ALGO-15 旅行家的预算
问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- Java实现 蓝桥杯 算法训练 审美课
算法训练 审美课 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 <审美的历程>课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手.老师 ...
- Java实现 蓝桥杯 算法训练 多阶乘计算
试题 算法训练 多阶乘计算 问题描述 我们知道,阶乘n!表示n*(n-1)(n-2)-21, 类似的,可以定义多阶乘计算,例如:5!!=531,依次可以有n!..!(k个'!',可以简单表示为n(k) ...
- Java实现 蓝桥杯 算法训练 找零钱
试题 算法训练 找零钱 问题描述 有n个人正在饭堂排队买海北鸡饭.每份海北鸡饭要25元.奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25.50.100元),而且饭堂阿姨一开始没有任何零钱.请问饭 ...
- Java实现 蓝桥杯 算法训练 第五次作业:字符串排序
试题 算法训练 第五次作业:字符串排序 问题描述 输入一个小写字符串,按从小到大的顺序输出. 输入格式 bcaed 输出格式 abcde 顶格输出,中间没有空格 样例输入 一个满足题目要求的输入范例. ...
随机推荐
- LabVIEW动态添加控件
综述: 事例1: 未执行: 执行后:
- 漫谈Huawei LiteOS五大内核模块
[摘要]Huawei LiteOS是华为面向IoT领域,构建的“统一物联网操作系统和中间件软件平台”,以轻量级(内核小于10k).低功耗(1节5号电池最多可以工作5年),快速启动,互联互通,安全等关键 ...
- SpringMVC底层执行原理
一个简单的HelloSpringMVC程序 先在web,xml中注册一个前端控制器(DispatcherServlet) <?xml version="1.0" encodi ...
- 用C++验证三门问题
三门问题(换门): #include <iostream> #include <cstdlib> #include <ctime> #define random(a ...
- 快速配置Samba服务
1.安装samba 这里以CenOS 7为例,其他系统类似 yum install samba samba-client samba-common 2.修改smb.conf 最好先备份原文件,以防 ...
- ORA-12519,TNS:no appropriate service handler found的问题 超过连接数
http://www.2cto.com/database/201205/133542.html ORA-12519,TNS:no appropriate service handler found的问 ...
- xv6 操作系统的环境搭建
xv6 是 MIT 设计的一个教学型操纵系统.xv6 可在 Intel X86 框架上运行,为了方便,建议将 xv6 运行在 QEMU 虚拟机器上,本人的实验环境是 ubuntu 18.04 . 1. ...
- Vue基础:子组件抽取与父子组件通信
在工作中承担一部分前端工作,主要使用Vue + Element UI. 随着版本迭代,需求增加,页面往往变得更加臃肿,不易维护.学习子组件的封装和抽取,能更好适应需求. 为什么需要子组件 可复用 将重 ...
- Java并发:线程安全分析
java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫 ...
- 【Mac】pip自定义源【永久有效】
鉴于国内网络环境,pip安装比较慢已成为不争的事实,通过以下几步轻松解决 1.创建文件夹 mkdir -/.pip 2.创建配置文件 vim -/.pip/pip.conf mkdir ~/.p ...