Snippets

cia_rana 【コロプラからの挑戦状!】バトルガールハイスクールで最大コンボをキメよう!

Created by cia_rana last modified
#include <iostream>
#include <list>
using namespace std;

#define SKIP_NUM 2 + 1
#define INPUT_SUP 100

void solve() {
    // SKIP_NUM個前までの入力,最大値を保存するリスト
    list<int> inputs, each_combo;
    for(int i = 0; i < SKIP_NUM; i++) {
        inputs.push_back(INPUT_SUP);
        each_combo.push_back(0);
    }
    
    int n;
    cin >> n;
    
    int current_input, current_combo, combo_max = 0;
    for(int i = 0; i < n; i++) {
        cin >> current_input;
        current_combo = 1;
        
        std::list<int>::iterator inputs_itr = inputs.begin();
        std::list<int>::iterator each_combo_itr = each_combo.begin();
        for(int j = 0; j < SKIP_NUM; j++) {
            if(*inputs_itr < current_input && current_combo <= *each_combo_itr) {
                current_combo = (*each_combo_itr) + 1;
            }
            inputs_itr++;
            each_combo_itr++;
        }
        
        combo_max = max(combo_max, current_combo);
        
        each_combo.pop_front();
        each_combo.push_back(current_combo);
        inputs.pop_front();
        inputs.push_back(current_input);
    }
    cout << combo_max;
}

int main(void){
    solve();
    return 0;
}
#include <iostream>
#include <list>
using namespace std;

#define SKIP_NUM 2 + 1
#define INPUT_SUP 100

void solve() {
    // SKIP_NUM個前までの入力,最大値を保存するリスト
    list<int> inputs(SKIP_NUM, INPUT_SUP), each_max(SKIP_NUM, 0);
    
    int n;
    cin >> n;
    
    int current_input, current_combo, combo_max = 0;
    for(int i = 0; i < n; i++) {
        cin >> current_input;
        current_combo = 1;
        
        auto inputs_itr = inputs.begin();
        auto each_max_itr = each_max.begin();
        for(int j = 0; j < SKIP_NUM; j++) {
            if(*inputs_itr < current_input && current_combo <= *each_max_itr) {
                current_combo = *each_max_itr + 1;
            }
            inputs_itr++;
            each_max_itr++;
        }
        
        combo_max = max(combo_max, current_combo);
        
        inputs.pop_front();
        inputs.push_back(current_input);
        each_max.pop_front();
        each_max.push_back(current_combo);
    }
    cout << combo_max;
}

int main(void){
    solve();
    return 0;
}
// 幅制約付き最長増加部分列問題(Range-Constrained Longest Increasing Subsequence)として解く.
// n: 入力数,m: スキップ数としたとき,
// 時間計算量O(nlong(m)),空間計算量O(n)のアルゴリズムが存在するが,
// 今回のn,mは比較的小さく,事前計算のオーバーへッドが大きいので,
// 今回は時間計算量O(nm),空間計算量O(m)のアルゴリズムを採用している.

using System;
using System.Linq;
using System.Collections.Generic;

class Solver
{
    private static readonly int SKIP_NUM = 3; // 何個前まで見るか
    private static readonly int INPUT_SUP = 100; // 入力値の上限
    
    public void solve()
    {
        // 入力数は使わないので破棄
        Console.ReadLine();
        
        var inputs = new List<int>(); // SKIP_NUM個前までの入力を格納
        var eachCombo = new List<int>(); // SKIP_NUM個前までのコンボを格納
        foreach (int _ in Enumerable.Range(0, SKIP_NUM))
        {
            inputs.Add(INPUT_SUP);
            eachCombo.Add(0);
        }
        
        // 最大コンボを見つける
        int comboMax = 0;
        foreach (int currentInput in Console.ReadLine().Split(' ')
                                       .Select(int.Parse).ToArray())
        {
            int currentCombo = 1;
            
            foreach (int skip in Enumerable.Range(0, SKIP_NUM))
            {
                if (inputs[skip] < currentInput && currentCombo <= eachCombo[skip])
                {
                    currentCombo = eachCombo[skip] + 1;
                }
            }
            
            comboMax = Math.Max(comboMax, currentCombo);
            
            inputs.RemoveAt(0);
            inputs.Add(currentInput);
            eachCombo.RemoveAt(0);
            eachCombo.Add(currentCombo);
        }
        
        Console.Write(comboMax);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var solver = new Solver();
        solver.solve();
    }
}
// 幅制約付き最長増加部分列問題(Range-Constrained Longest Increasing Subsequence)として解く.
// n: 入力数,m: スキップ数としたとき,
// 時間計算量O(nlong(m)),空間計算量O(n)のアルゴリズムが存在するが,
// 今回のn,mは比較的小さく,事前計算のオーバーへッドが大きいので,
// 今回は時間計算量O(nm),空間計算量O(m)のアルゴリズムを採用している.

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.List;
import java.util.LinkedList;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.util.Iterator;
import java.lang.Math;

class Solver {
    private static final int SKIP_NUM = 3; // 何個前まで見るか
    private static final int INPUT_SUP = 100; // 入力値の上限
    
    public void solve() throws Exception {
        try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            // 入力数は使わないので破棄
            br.readLine();
            
            // SKIP_NUM個前までの入力を格納
            List<Integer> inputs = Stream.generate(() -> INPUT_SUP)
                                     .limit(SKIP_NUM)
                                     .collect(Collectors.toCollection(LinkedList::new));
            
            // SKIP_NUM個前までの最大コンボを格納
            List<Integer> eachMax = Stream.generate(() -> 0)
                                      .limit(SKIP_NUM)
                                      .collect(Collectors.toCollection(LinkedList::new));
            
            // 最大コンボを見つける
            int comboMax = 0;
            for (int currentInput : Stream.of(br.readLine().split(" "))
                                      .mapToInt(Integer::parseInt)
                                      .toArray()) {
                int currentCombo = 1;
                
                Iterator<Integer> inputsItr = inputs.iterator();
                Iterator<Integer> eachMaxItr = eachMax.iterator();
                for (int i = 0; i < SKIP_NUM; i++) {
                    int input = inputsItr.next();
                    int max = eachMaxItr.next();
                    if (input < currentInput && currentCombo <= max) {
                        currentCombo = max + 1;
                    }
                }
                
                comboMax = Math.max(comboMax, currentCombo);
                
                inputs.add(currentInput);
                inputs.remove(0);
                eachMax.add(currentCombo);
                eachMax.remove(0);
            }
            
            System.out.println(comboMax);
        }
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Solver solver = new Solver();
        solver.solve();
    }
}
// 幅制約付き最長増加部分列問題(Range-Constrained Longest Increasing Subsequence)として解く.
// n: 入力数,m: スキップ数としたとき,
// 時間計算量O(nlong(m)),空間計算量O(n)のアルゴリズムが存在するが,
// 今回のn,mは比較的小さく,事前計算のオーバーへッドが大きいので,
// 今回は時間計算量O(nm),空間計算量O(m)のアルゴリズムを採用している.

(function() {
    const SKIP_NUM = 3; // 何個前まで見るか
    const NUM_SUP = 100; // 入力値の上限
    
    function solve(n, nums) {
        // SKIP_NUM個前までの入力を格納
        var preNums = new Array(SKIP_NUM);
        
        // SKIP_NUM個前までのコンボを格納
        var eachCombo = new Array(SKIP_NUM);
        
        for (var i = 0; i < SKIP_NUM; i++) {
            preNums[i] = NUM_SUP;
            eachCombo[i] = 0;
        }
        
        // 最大コンボを見つける
        var comboMax = 0;
        nums.forEach(function(currentNum) {
            var currentCombo = 1;
            
            for (var i = 0; i < SKIP_NUM; i++) {
                if (preNums[i] < currentNum && currentCombo <= eachCombo[i]) {
                    currentCombo = eachCombo[i] + 1;
                }
            }
            
            comboMax = Math.max(comboMax, currentCombo);
            
            preNums.push(currentNum);
            preNums.shift();
            eachCombo.push(currentCombo);
            eachCombo.shift();
        });
        
        return comboMax;
    }
    
    function main(args) {
        var n = Number(args[0]);
        var nums = args[1].split(" ").map(Number);
        
        console.log(solve(n, nums));
        
        return;
    }
    
    // あらかじめ標準入力を全て読み込み,main functionを起動
    (function() {
        var lines = [];
        var reader = require("readline").createInterface({
            input: process.stdin,
            output: process.stdout,
            terminal: false
        });
        reader.on("line", function(line) {
            lines.push(line);
        });
        process.stdin.on("end", function() {
            main(lines);
        });
    })();
})();
<?php
    const SKIP_NUM = 3;
    const INPUT_SUP = 100;
    
    $n = trim(fgets(STDIN));
    
    $inputs = array(); // 入力されるランダムな整数列を格納
    $each_combo = array(); // SKIP_NUM前までのコンボ数を格納
    
    for($i = 0; $i < SKIP_NUM; $i++) {
        array_push($inputs, INPUT_SUP);
        array_push($each_combo, 0);
    }
    $inputs = array_merge($inputs, explode(" ", trim(fgets(STDIN))));
    
    $combo_max = 0;
    for($i = 0; $i < $n; $i++) {
        $current_combo = 1;
        $input = $inputs[$i + SKIP_NUM];
        
        for($skip = 0; $skip < SKIP_NUM; $skip++) {
            if($inputs[$i + $skip] < $input && $current_combo <= $each_combo[$skip]) {
                $current_combo = $each_combo[$skip] + 1;
            }
        }
        
        $combo_max = max($combo_max, $current_combo);
        
        array_push($each_combo, $current_combo);
        array_shift($each_combo);
    }
    
    print($combo_max);

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.