首页 > 试题广场 > 俄罗斯方块
[编程题]俄罗斯方块
  • 热度指数:23252 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小易有一个古老的游戏机,上面有着经典的游戏俄罗斯方块。因为它比较古老,所以规则和一般的俄罗斯方块不同。
荧幕上一共有 n 列,每次都会有一个 1 x 1 的方块随机落下,在同一列中,后落下的方块会叠在先前的方块之上,当一整行方块都被占满时,这一行会被消去,并得到1分。
有一天,小易又开了一局游戏,当玩到第 m 个方块落下时他觉得太无聊就关掉了,小易希望你告诉他这局游戏他获得的分数。

输入描述:
第一行两个数 n, m
第二行 m 个数,c1, c2, ... , cm , ci 表示第 i 个方块落在第几列
其中 1 <= n, m <= 1000, 1 <= ci <= n


输出描述:
小易这局游戏获得的分数
示例1

输入

3 9
1 1 2 2 2 3 1 2 3

输出

2
// 超简洁哦,只需把m的值在长度为n的数组上自增就好啦,然后通过sort()取最短的数

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < m; i++) {
            arr[scanner.nextInt() - 1]++;
        }
        Arrays.sort(arr);
        System.out.println(arr[0]);
    }
}


发表于 2018-08-27 15:51:26 回复(11)
 //这道题的思路很简单,N列,就定义一个1*N的数组,每一列落下方块时,对应数组位置+1,最后取数组的最小值就可以了

#include<iostream>
#include<vector>

using namespace std;

int minV(vector<int> v)
{
    int min = v[0];
    for (int i = 1; i < v.size(); i++)
    {
        if (v[i] < min)
            min = v[i];
    }

    return min;
}

int main()
{
    int n, m;
    while (cin >> n >> m)
    {
        vector<int> vec(n, 0);//定义n*1的数组

        for (int i = 0; i < m; i++)
        {
            int input;
            cin >> input; //落下方块的位置
            vec[input - 1]++;//对应位置+1
        }
        cout << minV(vec) << endl; //输出数组的最小值
    }
    return 0;
}


发表于 2018-08-14 10:42:15 回复(3)
n, m = map(int, raw_input().split())

a = [0 for i in range(n)]

c = map(int, raw_input().split())
for i in c :
    a[i - 1] += 1

print min(a)
编辑于 2019-09-02 10:10:57 回复(5)

JavaScript

let line1=readline().split(' '),
    line2=readline().split(' '),
    n = line1[0],
    m = line1[1],
    count = new Array(parseInt(n)).fill(0);
for(let i=0;i<m;i++){
    count[line2[i]-1]++;
}
console.log(Math.min(...count));
发表于 2019-08-01 00:51:54 回复(0)

Java

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < m; i++) {
            int num = sc.nextInt();
            if (!map.containsKey(num)) {
                map.put(num, 1);
            } else {
                map.put(num, map.get(num) + 1);
            }
        }
        int min = Integer.MAX_VALUE;
        if (map.size() == n) {
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                if (entry.getValue() < min) {
                    min = entry.getValue();
                }
            }
        } else {
            min = 0;
        }
        System.out.println(min);
    }
}
发表于 2019-06-30 13:51:10 回复(0)
import sys
n,m=list(map(int,sys.stdin.readline().split()))
arr=list(map(int,sys.stdin.readline().split()))
if len(set(arr))<n:
    print(0)
else:
    num=[]
    for i in arr:
        num.append(arr.count(i))
    print(min(num))

发表于 2019-08-13 15:53:58 回复(0)
n, m = map(int, input().split())
c=list(map(int,input().split()))
ans=[0 for i in range(n)]
for item in c:
    ans[item-1]+=1
print(min(ans))
发表于 2020-03-20 16:37:30 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        int[] a=new int[n];
        for(int i=0;i<m;i++){
            int t=sc.nextInt();
            a[t-1]++;
        }
            Arrays.sort(a);
            System.out.print(a[0]);
    }
}


编辑于 2020-02-25 20:48:51 回复(1)
JavaScript(Node) 😎题目:网易-俄罗斯方块
const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    ouput: process.stdout
})
let inputArr = []
rl.on('line',line => {
    if(!line) return
    inputArr.push(line.trim())
    if(inputArr.length === 2){
        let n = +inputArr[0].split(' ')[0] //荧幕上共有 n 列
        let m = +inputArr[0].split(' ')[1]//共有m个方块落下
        let block = inputArr[1].split(' ').map(e => +e) //消除方块数组,map遍历转化number
        let res = new Array(n).fill(0)//initial 初始化,n列,每一列初始化为0
        // res[block-1]对应各行数n的值
        for (let i = 0; i < block.length; i++) {
            res[(block[i]-1)] ++
        }
        // 排序a-b 取最小值res[0]即为方块最多消除的行数
        res.sort((a,b)=>{
            return a-b
        })
        console.log(res[0])
    }
})


发表于 2020-02-25 19:33:08 回复(0)
import sys
lines=sys.stdin.readlines()
n,m=map(int,lines[0].strip().split())
b=list(map(int,lines[1].strip().split()))

task=[]

for i in range(1,n+1):
    count=b.count(i)
    task.append(count)
print(sorted(task)[0])

编辑于 2020-02-07 17:33:30 回复(0)
#include<iostream>
using namespace std;
int main(){
    int n,m;
    while(cin>>n>>m){
        int* a=new int[n];
        int temp=0,min=1001;
        for(int i=0;i<m;i++){
            cin>>temp;
            a[temp-1]++;
        }
        for(int i=0;i<n;i++)
            if(a[i]<min)
                min=a[i];
        cout<<min<<endl;
    }
}

发表于 2020-01-10 15:16:01 回复(0)
#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char const *argv[])
{
    int n=0 ,m=0 ,temp=0;
    cin >> n >> m;
    std::vector<int> v(n+1);

    for(int i=0 ;i<m ;++i)
    {
        cin >>temp;
        ++v[temp];
    }

    int min=v[1];
    
    for(int i=1 ;i<v.size() ;++i)
        min=min>v[i] ? v[i] : min;

    cout << min;
    
    return 0;
}

发表于 2019-11-15 17:17:36 回复(0)
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n,m;
    cin >> n;
    int *data = new int[n];
    while(cin >> m)
    {
        data[m-1]++;
    }
    sort(data,data+n);
    cout << data[0] << endl;
    return 0;
}

发表于 2019-11-02 13:16:11 回复(0)

Python

from collections import Counter

n, m = map(int, input().split()[:2])
c = list(map(int, input().split()[:m]))
res = Counter(c).most_common()
print(0 if len(res) < n else res[-1][1])
发表于 2019-10-31 18:04:14 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,m,ans=99999;
    cin>>n>>m;
    vector<int> num(n+1,0);
    for(int i=0;i<m;i++){
        int temp;
        cin>>temp;
        num[temp]++;
    }
    for(int i=1;i<=n;i++)
        ans=min(ans,num[i]);
    cout<<ans;
    return 0;
}

发表于 2019-10-09 21:09:02 回复(0)
import java.util.*;
//思路就是存储每个方块出现的次数,最后求次数最小的方块,即为得分数。
public class Main{
    public static void main(String[] args){
        Map<Integer, Integer> map = new HashMap<>();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        for(int i = 0; i < m; i++){
            int temp = sc.nextInt();
            if(map.containsKey(temp)){
                map.put(temp, map.get(temp) + 1);
            }else{
                map.put(temp, 1);
            }
        }
        //判断每个元素出现的次数,次数最小的就是得分
        int score = Integer.MAX_VALUE;
        if(map.size() == n){ //保证n列上只出现n个不同的方块
            for(Integer key : map.keySet()){
            score = Math.min(score, map.get(key));
        }
        }else{
            score = 0;
        }
        System.out.print(score);
    }
}

发表于 2019-09-17 09:08:20 回复(1)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, m, x;
    cin>>n>>m;
    int a[n+1];
    memset(a, 0, sizeof(a));
    for(int i=0;i<m;i++){
        cin>>x;
        a[x]++;
    }
    int Min = INT_MAX;
    for(int i=1;i<=n;i++)
        Min = min(Min, a[i]);
    cout<<Min<<endl;
    return 0;
}

发表于 2019-07-26 11:45:35 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int m,n,c[1001];
    cin>>n>>m;
    map<int,int>mp;
    for(int i=0;i<m;i++)
    {
        cin>>c[i];
        mp[c[i]-1]++;
    }
    int res=m;
    for(int i=0;i<n;i++)
        res=res<mp[i]?res:mp[i];
    cout<<res;
    return 0;
}

发表于 2019-06-29 21:00:59 回复(0)
var line1 = readline().split(' ');
var cols = parseInt(line1[0]);
var blocks = parseInt(line1[1]);

var colsOfBlockArr = readline().split(' ');

function getRows(cols, colsOfBlockArr) {
    let count = 10000;
    for (let i = 0; i < cols; i += 1) {
        let colCount = colsOfBlockArr.filter(col => +col === (i + 1)).length; // 每列个数
        if (colCount < count) {
            count = colCount;
        }
    }
    return count;
}

print(getRows(cols, colsOfBlockArr));

发表于 2018-12-02 17:44:08 回复(0)
importjava.util.Scanner;
 
publicclassMain {
 
    publicstaticvoidmain(String[] args) {
        // 很简单的一题,时间复杂度O(m+n),空间复杂度O(m+n),对应位数自增取最小值
        Scanner sc = newScanner(System.in);
        intn=sc.nextInt(),m=sc.nextInt();
        int[] nx = newint[n];
        int[] num = newint[m];
        for(inti = 0; i < m; i++) {
            num[i] = sc.nextInt();
            nx[num[i]-1]++;
        }
        intMIN = 1001;
        for(inti = 0; i < n; i++) {
            MIN = nx[i]<MIN?nx[i]:MIN;
        }
        System.out.println(MIN);
    }
 
}

发表于 2018-08-24 10:16:43 回复(0)