试题 算法训练 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的更多相关文章

  1. Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)

    试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...

  2. Java实现蓝桥杯 算法训练 大等于n的最小完全平方数

    试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...

  3. java实现 蓝桥杯 算法训练 Password Suspects

    问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...

  4. Java实现 蓝桥杯 算法训练VIP 报数(暴力+数学)约瑟夫环问题

    试题 算法训练 报数 问题描述 现有n个同学站成一圈,顺时针编号1至n.从1号同学开始顺时针1/2报数,报到1的同学留在原地,报到2的同学退出圆圈,直到只剩一名同学为止.问最后剩下的同学编号. 输入格 ...

  5. Java实现蓝桥杯 算法训练 ALGO-15 旅行家的预算

    问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  6. Java实现 蓝桥杯 算法训练 审美课

    算法训练 审美课 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 <审美的历程>课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手.老师 ...

  7. Java实现 蓝桥杯 算法训练 多阶乘计算

    试题 算法训练 多阶乘计算 问题描述 我们知道,阶乘n!表示n*(n-1)(n-2)-21, 类似的,可以定义多阶乘计算,例如:5!!=531,依次可以有n!..!(k个'!',可以简单表示为n(k) ...

  8. Java实现 蓝桥杯 算法训练 找零钱

    试题 算法训练 找零钱 问题描述 有n个人正在饭堂排队买海北鸡饭.每份海北鸡饭要25元.奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25.50.100元),而且饭堂阿姨一开始没有任何零钱.请问饭 ...

  9. Java实现 蓝桥杯 算法训练 第五次作业:字符串排序

    试题 算法训练 第五次作业:字符串排序 问题描述 输入一个小写字符串,按从小到大的顺序输出. 输入格式 bcaed 输出格式 abcde 顶格输出,中间没有空格 样例输入 一个满足题目要求的输入范例. ...

随机推荐

  1. C# 判断文件格式的一些总结

    前提概述: 项目中 经常会有上传图片的地方  有的时候需要对图片类型做一些要求   这个时候就需要一些判断   虽然前段上传的时候可以去做类型的限制  或者后台接受的时候从file的type 中获取图 ...

  2. DoNet:浅淡对delegate的理解

    1 前言 C#的相关文档,MSDN上其实已经很详细了,关于delegate的使用可以参 考MSDN上的文档https://msdn.microsoft.com/zh-cn/library/900fyy ...

  3. python路径操作新标准:pathlib 模块

    之前如果要使用 python 操作文件路径,我总是会条件反射导入 os.path. 而现在,我会更加喜欢用新式的 pathlib, 虽然用得还是没有 os.path 熟练,但是以后会坚持使用. pat ...

  4. 数组的操作。1,JS数组去重。2,把数组中存在的某个值,全部找出来。3在JS数组指定位置插入元素。。。

    1,数组去重 let arr = [1,2,3,4,5,6,1,2,3,'a','b','a']; let temp = []; // 作为存储新数组使用 for(let i = 0; i < ...

  5. 写ssm项目的注意点

    注意事项: 输出台乱码 a链接以post提交 表单提交前验证 onsubmit 属性在提交表单时触发. onsubmit 属性只在 中使用. <form action="/demo/d ...

  6. javaweb学习之路(1)request

    1.本次练习写一个简单的注册页面 准备工作:首先搭建好服务器tomcat环境,使用的编译软件是eclipse 2.在eclipse中创建一个web工程 3.在webContent文件夹下创建一个reg ...

  7. JavaScript之ES5的继承

    自从有了ES6的继承后,ES5的继承也退出了舞台,在实际开发也不会用得着: 先看看ES6的继承 class Father{ constructor(a){ console.log(a); } play ...

  8. promise的理解和使用

    1. Promise是什么 1.1 promise 的理解 1. 抽象表达: Promise 是 JS 中进行异步编程的新的解决方案(旧的是纯回调形式) 2. 具体表达: (1)从语法上说:Promi ...

  9. 如何搭建一个WEB服务器项目(四)—— 实现安卓端图片加载

    使用Glide安卓图片加载库 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...

  10. spark机器学习从0到1特征变换-标签和索引的转化(十六)

      一.原理 在机器学习处理过程中,为了方便相关算法的实现,经常需要把标签数据(一般是字符串)转化成整数索引,或是在计算结束后将整数索引还原为相应的标签. Spark ML 包中提供了几个相关的转换器 ...