AT_future_contest_2019_final_b ビジュアライザ
Description
[problemUrl]: https://atcoder.jp/contests/future-contest-2019-final/tasks/future_contest_2019_final_b
Input Format
N/A
Output Format
N/A
Explanation/Hint
### テストケース生成
乱数シードを指定し、ローカル実行用にテストケースを生成する機能を用意しました。
- 本機能はchrome上での動作を想定しています。他の環境で正常に動作する保証はなく、特にIEでは動作しないことを確認しています。
- 本機能は当コンテスト上でのテストケースとの同一性を保証するものではありません。特に乱数生成の仕様に差異があることが考えられますので、予めご了承ください。
Seed=
### ビジュアライザー
入力ファイルと出力ファイルから、点数の計算および結果を可視化するビジュアライザを用意しました。
- 本ビジュアライザはchrome上での動作を想定しています。他の環境で正常に動作する保証はなく、特にIEでは動作しないことを確認しています。
- 本ビジュアライザから解答の提出はできません。 AtCoder A問題「モンスターテイマー」上より解答を提出して下さい。
- 本ビジュアライザ上で計算された点数は、当コンテスト上での点数を保証するものではありません。本ビジュアライザを使用することによるあらゆる損害は保障しかねますので、予めご了承ください。
入力ファイル:
出力ファイル:
▶ 再生速度: 遅速
turn
たかはしくん は なかまに なりたそうに こちらをみている!
Score
0
おかね
0
スキル
※表示するモンスターのビジュアライズは、あくまでイメージです。スコアには影響しません。
const MAX_LEVEL = 10;
const APPANAGE = 1000;
const COST_TRAINING = 10000;
var inputFlg = false;
var loadedFlg = false;
var T = 1000;
var N = 10;
var M = 30000;
var rendTurn = 0;
var tasks = [];
var outputData = [];
var order = [];
var golds = [];
var skills = [];
var trainings = [];
var done = []
var mosterType = []
var invalidQuests = []
var doneQuests = []
class Task{
constructor(inputStr){
this.start = Number(inputStr[0]);
this.end = Number(inputStr[1]);
this.gold = Number(inputStr[2]);
this.takes = [...Array(N)].map(() => 0);
for(var i=0; i < N; i++){
this.takes[i] = Number(inputStr[3 + i]);
}
this.done = false;
}
output(){
ret = start + "-" + end + " \\" + gold + " \[" + takes[0];
for(var i; i < N; i++){
ret += +","+takes[i];
}
ret += "\]"
return ret;
}
}
class Order{
constructor(inputStr){
this.type = Number(inputStr[0]);
if(this.type == 1 || this.type == 2){
this.param = Number(inputStr[1]);
}
}
output(){
ret = this.type;
if(type == 1 || type == 2){
ret += "-" + this.param;
}
return ret;
}
}
// テストケース生成
$ ("#createTestCase").click(function\ ()\ {
\ let\ seed\ = $('#testCaseSeed').val();
if (!isFinite(seed) || Number(seed) < 0 || !seed){
seed = 0;
$ ('#testCaseSeed').val(seed);
\ }
\ console.log("seed="+seed);
\ const\ random\ =\ new\ Random(seed);
\ records\ =\ "1000\ 10\ 30000\r\n";
\ var\ quests\ =\ [];
\ var\ questType\ =\ [0,1,2];
\ var\ L\ =\ 0;
\ for\ (var\ i\ =\ 0;\ i\ \ 0);
\ takes[0]\ =\ random.nextInt(1,\ 10);
\ for(var\ j\ =\ 1;\ j\ \ 0;\ j--){
\ var\ r\ =\ Math.floor(random.nextDouble()\ *\ (j\ +\ 1));
\ var\ tmp\ =\ takes[j];
\ takes[j]\ =\ takes[r];
\ takes[r]\ =\ tmp;
\ }
\ var\ sum\ =\ takes.reduce((a,x)\ =>\ a+=x,0);
\ var\ C\ =\ Math.floor(sum\ *\ 1.3\ *\ random.nextInt(1,2000\ ));
\ records\ +=\ A\ +\ "\ "\ +\ B\ +\ "\ "\ +\ C;
\ for(var\ j\ =\ 0;\ j\ \ 19))\ ^\ (t\ ^\ (t\ >>>\ 8));
\ }
\ nextInt(min,\ max)\ {
\ const\ r\ =\ Math.abs(this.next());
\ return\ min\ +\ (r\ %\ (max\ +\ 1\ -\ min));
\ }
\ nextDouble()\ {
\ const\ r\ =\ Math.abs(this.next());
\ return\ (r\ %\ (1000000007\ +\ 1))\ /\ 1000000007;
\ }
\ };
\ //\ 入力ファイルの読込
\ var\ handleInputFiles\ =\ function\ (file,\ callback)\ {
\ document.getElementById('inputFile').innerText\ =\ '';
\ document.getElementById('outputFile').innerText\ =\ ''; $('#output').val('');
inputFlg = false;
loadedFlg = false;
document.getElementById('score').innerText = 0;
var reader = new FileReader();
reader.readAsText(file[0]);
reader.onload = function (ev) {
const inputDatalist = reader.result.split(/\r\n|\r|\n/);
if(inputDatalist.length < 1){
console.log("No Text Error!! " + inputDatalist.length);
document.getElementById('inputFile').innerText = 'error!';
$ ('#input').val('');
\ return;
\ }
\ var\ firstLine\ =\ inputDatalist[0].split("\ ");
\ if(firstLine.length\ !=\ 3){
\ console.log("First\ Line\ Error!!\ "\ +\ inputDatalist.length);
\ document.getElementById('inputFile').innerText\ =\ 'error!'; $('#input').val('');
return;
}
for(var i = 0; i < 3; i++){
if(Number.isNaN(Number(firstLine[i]))){
console.log("First Line Error!! " + inputDatalist.length);
document.getElementById('inputFile').innerText = 'error!';
$ ('#input').val('');
\ return;
\ }
\ }
\ T\ =\ Number(firstLine[0]);
\ N\ =\ Number(firstLine[1]);
\ M\ =\ Number(firstLine[2]);
\ tasks\ =\ [...Array(M)].map(()\ =>\ null);
\ if(inputDatalist.length\ [...Array(N)].map(() => 0));
trainings = [...Array(T+1)].map(() => [...Array(N)].map(() => 0));
golds = [...Array(T+1)].map(() => 0);
golds[0] = 1000;
mosterType = [...Array(T+1)].map(() => "m1");
invalidQuests = [...Array(T+1)].map(() => false);
doneQuests = [...Array(T+1)].map(() => false);
for (var i = 0; i < T; i++) {
// copy
for(var j = 0; j < N; j++) {
skills[i+1][j] = skills[i][j];
trainings[i+1][j] = trainings[i][j];
}
mosterType[i+1] = mosterType[i];
var nowGold = golds[i];
var nowOrder = order[i];
switch(nowOrder.type){
case 1:
var skillNo = nowOrder.param-1;
if(skills[i][skillNo] >= MAX_LEVEL){
break;
}
var nextLevel = skills[i][skillNo] + 1;
if(nowGold < Math.pow(2,nextLevel) * COST_TRAINING){
break;
}
nowGold -= Math.pow(2,nextLevel) * COST_TRAINING;
trainings[i+1][skillNo]++;
if(trainings[i+1][skillNo] >= nextLevel){
trainings[i+1][skillNo]=0;
skills[i+1][skillNo]++;
var sum = 0;
for(var j = 0; j < N; j++) {
sum += skills[i+1][j];
}
switch(sum){
case 10:
mosterType[i+1] = "m2-a"
for(var j = 0; j < N; j++) {
if(skills[i+1][j]>1){
mosterType[i+1] = "m2-b"
break;
}
}
break;
case 20:
mosterType[i+1] = "m3-a"
for(var j = 0; j < N; j++) {
if(skills[i+1][j]>2){
mosterType[i+1] = "m3-b"
break;
}
}
break;
case 30:
mosterType[i+1] = "m4-a"
for(var j = 0; j < N; j++) {
if(skills[i+1][j]>3){
mosterType[i+1] = "m4-b"
break;
}
}
break;
case 50:
mosterType[i+1] = "m5-a"
for(var j = 0; j < N; j++) {
if(skills[i+1][j]>5){
mosterType[i+1] = "m5-b"
break;
}
}
break;
case 70:
mosterType[i+1] = "m6-a"
for(var j = 0; j < N; j++) {
if(skills[i+1][j]>7){
mosterType[i+1] = "m6-b"
break;
}
}
break;
case 90:
mosterType[i+1] = "m7-a"
for(var j = 0; j < N; j++) {
if(skills[i+1][j]>9){
mosterType[i+1] = "m7-b"
break;
}
}
break;
case 100:
mosterType[i+1] = "m8"
break;
default:
break;
}
}
break;
case 2:
var task = tasks[nowOrder.param-1];
if(task.start > i+1 || task.end < i+1){
invalidQuests[i] = true;
break;
}
if(done[nowOrder.param-1]){
doneQuests[i] = true;
break;
}
money = task.gold;
money *= (1 + 9 * (i+1 - task.start) / (task.end - task.start));
skillLack = 0;
for (var j = 0; j < N; j++){
skillLack += Math.max(0, task.takes[j] - skills[i][j]);
}
if (skillLack == 0){
money *= 10;
} else {
money *= Math.pow(0.5, skillLack);
money += 1e-9;
}
nowGold += Math.floor(money);
done[nowOrder.param-1] = true;
break;
case 3:
nowGold += APPANAGE;
break;
default:
document.getElementById('outputFile').innerText = 'error! not 1 or 2 or 3!';
console.log("output filr error! Line=" + i);
console.log("error!!");
$ ('#output').val('');
\ return;
\ }
\ golds[i\ +\ 1]\ =\ nowGold;
\ var\ str\ =\ i\ +\ "\ "\ +\ nowGold\ +\ "\ \[";
\ for(var\ j\ =\ 0;\ j\