#P1688. 2024.3.10-第一题-跳格子
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 191
            Accepted: 83
            Difficulty: 5
            
          
          
          
                       所属公司 : 
                              米哈游
                                
            
                        
              时间 :2024年3月10日
                              
                      
          
 
- 
                        算法标签>模拟          
 
2024.3.10-第一题-跳格子
思路:模拟
按照题意暴力模拟即可,维护每一个史莱姆在第i秒的位置,然后使用一个set去记录当前所有史莱姆在的位置,则第i秒对应的空余位置数则为n−st.size()
C++
#include<bits/stdc++.h>
using namespace std;
const int N=1E5+10;
int n,a[N],w[N],vis[N];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        w[i]=i;
        vis[i]=1;
    }
    for(int t=1;t<=n;t++){
        unordered_set<int>st;
        for(int i=1;i<=n;i++){
            if(a[i]){
                w[i]=min(n+1,w[i]+1);
            }
            else{
                w[i]=max(0,w[i]-1);
            }
            if(w[i]>=1&&w[i]<=n)st.insert(w[i]);
        }
        cout<<n-st.size()<<" ";
    }
    return 0;
}
java
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //while (in.hasNextInt()) {
            int nums = in.nextInt();
            int[] pos = new int[nums + 1];
            int[] dir = new int[nums + 1];
            for (int j = 0; j < nums; j++) {
                dir[j] = in.nextInt(); // 读取方向数组
                pos[j] = j + 1; // 设置位置数组
                
            }
            int[] res = new int[nums];
            int sum = 0;
            for (int i = 1; i <= nums; i++) {
                for (int jump = 0; jump < nums; jump++) {
                    if (dir[jump] == 1) {
                        if ((pos[jump] + i) > nums) {
                            sum++;
                        }
                    } else if (dir[jump] == 0) {
                        if ((pos[jump] - i) <= 0) {
                            sum++;
                        }
                    }
                }
                if (sum >= nums){
                    sum = nums;
                }
                res[i - 1] = sum;
                System.out.print(sum);
                if (sum != nums) {
                    System.out.print(" ");
                } else {
                    System.out.println();
                }
            }
        //}
    }
}
python
class node:
    def __init__(self):
        self.left = 0
        self.right = 0
gezi = [node() for i in range(3005)]
n = int(input())
number = input()
number = number.split(" ")
for i in range(n):
    if number[i] == '1':
        gezi[i].right += 1
    else:
        gezi[i].left += 1
for i in range(n):
    #左跳和右跳分开更新
    ans = 0
    for i in range(n):
        if i == (n-1):
            gezi[i].left = 0
        else:
            gezi[i].left = gezi[i+1].left
    for i in range(n-1, -1, -1):
        if i == 0:
            gezi[i].right = 0
        else:
            gezi[i].right = gezi[i-1].right
    for i in range(n):
        if gezi[i].left == 0 and gezi[i].right == 0:
            ans += 1
    print(ans, end=" ")
        题目描述
地图上有n个格子排成一排,最左边的格子为1,最右边的格子为n。第0秒时,每个格子都有一只史菜姆。
第i只史莱姆的跳跃方向用数组a表示。ai=0表示史莱姆跳跃的方向是往左。若第i秒史莱姆位于格子x,那么第i+1秒史莱姆会跳到格子x−1。如果当前史莱姆在格子1,则下一秒史莱姆将跳出地图。 ai=1表示史莱姆跳跃的方向是往右。若第i秒史莱姆位于格子x,那么第i+1秒史莱姆会跳到格子x+1。如果当前史莱姆在格子n,则下一秒史莱姆将跳出地图。
米小游想知道第1~n秒,地图上有多少个格子没有史菜姆
输入描述
第一行包含一个整数n(1≤n≤3×103),表示地图上的格子数量。
第二行包含n个整数 ai(0≤a≤1),表示每只史莱姆的跳跃方向。
输出描述
输出1~n秒格子上没有史莱姆的数量
样例
输入
3
1 0 1
输出
1 2 3
说明
史莱姆1~3的跳跃方向分别为,往右,往左,往右。
第1秒,史莱姆1跳到格子 2,史菜姆2跳到格子1,史菜姆3跳出地图,格子3没有史莱姆。
第2秒,史莱姆1跳到格子3,史莱姆2跳出地图,格子1 2 没有史莱姆。
第3秒,史莱姆1跳出地图,格子1,2,3 没有史莱姆。