首页 > 试题广场 >

解救小易

[编程题]解救小易
  • 热度指数:26062 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置)。小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界)。大反派超超想去捕捉可爱的小易,他手里有n个陷阱。第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉。你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易。

输入描述:
第一行为一个整数n(n ≤ 1000),表示超超一共拥有n个陷阱。
第二行有n个整数xi,表示第i个陷阱的横坐标
第三行有n个整数yi,表示第i个陷阱的纵坐标
保证坐标都在草地范围内。


输出描述:
输出一个整数,表示小易最少可能多少秒就落入超超的陷阱
示例1

输入

3
4 6 8
1 2 1

输出

3
#include<iostream>
using namespace std;

int main()
{
    int n,count=2000;
    int x[1000]={0};
    int y[1000]={0};
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x[i];   
    }
    for(int i=0;i<n;i++){
        cin>>y[i];   
    }
    for(int i=0;i<n;i++){
        if(count>(x[i]+y[i]))
            count = (x[i]+y[i]);
    }
     
    cout<<(count-2)<<endl;
    return 0;
}
发表于 2016-08-11 11:13:34 回复(0)
//理解题意后直接计算就ok了
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            int[][] num = new int[n][2];
            for(int i=0;i<n;i++){
                num[i][0] = sc.nextInt();
            }
            for(int i=0;i<n;i++){
                num[i][1] = sc.nextInt();
            }
            int min = num[0][0]-1+num[0][1]-1;
            int t = 0;
            for(int i=1;i<n;i++){
                t = num[i][0]-1+num[i][1]-1;
                if(min>t)min=t;
            }
            System.out.println(min);
        }
    }
}

发表于 2017-08-19 19:51:51 回复(1)

用python 3 一行解决问题

import sys

def save_xiaoyi(list_x, list_y):
    result_list = [(a1+a2) for (a1, a2) in zip(list_x, list_y)]

    return min(result_list)-2

# 读取输入数据,将每行以列表形式存储
data = sys.stdin.readlines()
# 提取x坐标
list_x = [int(i) for i in data[1].split()]
# 提取y坐标
list_y = [int(i) for i in data[2].split()]

print(save_xiaoyi(list_x, list_y))
发表于 2017-08-14 21:51:17 回复(1)
//思路:从[1,1]走到[x,y]需要(x-1)+(y-1)步。这样对每个陷阱计算一下从[1,1]到陷阱所用的步数,求最小值即可。
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int x[2000],y[2000];
    for(int i=0;i<n;++i)
        cin>>x[i];
    for(int i=0;i<n;++i)
        cin>>y[i];
    int min=99999999;
    for(int i=0;i<n;++i){
        int dis=x[i]-1+y[i]-1;
        if(min>dis)
            min=dis;
    }
    cout<<min;
}
发表于 2017-08-11 16:09:22 回复(0)
#include <iostream>
#include<algorithm>
using namespace std;
int main()
 {
     int n,a[1000],b[1000],c[1000],i;
     cin>>n;
     for(i=0;i<n;i++)
     {
         cin>>a[i];
         a[i]-=1;
         b[i]=a[i];
     }
     for(i=0;i<n;i++)
     {
         cin>>c[i];
         c[i]-=1;
         b[i]+=c[i];
     }
     sort(b,b+n);
     cout<<b[0];
     return 0;
 }
大水题

发表于 2019-09-06 19:58:24 回复(0)
#include<math.h>
#include<stdio.h>
#define min(a,b) a<b?a:b
int x[1000],y[1000],n,i,Min=999999999;
int main(){
    for(scanf("%d",&n),i=0;i<n;i++) scanf("%d",&x[i]);
    for(i=0;i<n;i++) 
        scanf("%d",&y[i]),Min=min(Min,(int)fabs(x[i]-1)+(int)fabs(y[i]-1));
    printf("%d\n",Min);
}

发表于 2017-10-21 10:24:12 回复(0)
Python  2 Line, 实际上一行就足够了
_ = int(input())
print(min(map(lambda x:sum(x) - 2,zip(map(int,input().split()),map(int,input().split())))))

发表于 2018-07-22 17:49:50 回复(3)
计算所有陷阱与小易初始位置的曼哈顿距离,然后输出最小值即可
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String strN;
        while((strN = br.readLine()) != null){
            int n = Integer.parseInt(strN);
            String[] lineX = br.readLine().split(" ");
            String[] lineY = br.readLine().split(" ");
            int minSecond = Integer.MAX_VALUE;
            // 即求取与小易初始位置最小的曼哈顿距离
            for(int i = 0; i < n; i++){
                minSecond = Math.min(minSecond, 
                                     Math.abs(Integer.parseInt(lineX[i]) - 1) 
                                     + Math.abs(Integer.parseInt(lineY[i]) - 1));
            }
            System.out.println(minSecond);
        }
    }
}


发表于 2020-12-05 11:27:06 回复(0)
/*先对每一组(x,y)求和,然后减去初始坐标(1,1)的和2,放入C数组,在对C
进行sort排序,输出最小值即可*/
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[1001],b[1001],c[1001];
    for(int i=0;i<n;i++)
    {
       cin>>a[i];
       c[i]=a[i];
    }
    for(int i=0;i<n;i++)
    {
       cin>>b[i];
       c[i]=c[i]+b[i]-2;
    }
    sort(c,c+n);
    cout<<c[0]<<endl;
}

发表于 2019-04-21 15:13:13 回复(0)
while True:
    try:
        num = int(input())
        x = list(map(int,input().split()))
        y = list(map(int,input().split()))
        result = abs(x[0]-1)+abs(y[0]-1)
        for i in range(1,num):
            result = min(result,abs(x[i]-1)+abs(y[i]-1))
        print(result)
    except Exception:
        break
编辑于 2018-10-22 11:07:16 回复(0)

import java.util.Scanner;
//非常简单的一道题,只要用二维数组存储好相应的横纵坐标,再将二维数组的值相加
//-2就可以了 -2的原因是小易的起始坐标为(1,1) 需要减去它
public class Main {

public static void main(String[] args) {
    Scanner s=new Scanner(System.in);
    //陷阱总数
    int count=s.nextInt();
    int[][] arrays =new int[count][2];
    for(int i=0;i<count;i++)
    {
        int x=s.nextInt();
        arrays[i][0]=x;
    }
    for(int j=0;j<count;j++)
    {
        int y=s.nextInt();
        arrays[j][1]=y;
    }
    int min=Integer.MAX_VALUE;
    int temp=0;
    for(int k=0;k<count;k++)
    {
        temp=0;
        for(int m=0;m<arrays[0].length;m++)
        {
            temp=temp+arrays[k][m];
        }
        if(temp<min)
        {
            min=temp;
        }
    }
    System.out.print(min-2);
}

}

发表于 2018-08-26 10:07:31 回复(0)
import java.util.Scanner;

public class Main{
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        int num=sc.nextInt();
        int minSec=10000;
        int [] row=new int[num];
        int [] column=new int[num];
        for(int i=0;i<num;i++){
            row[i]=sc.nextInt();
        }
        for(int i=0;i<num;i++){
            column[i]=sc.nextInt();
        }
        for(int i=0;i<num;i++){
            if((row[i]+column[i]-2)<minSec){
                minSec=row[i]+column[i]-2;
            }
        }
        System.out.println(minSec);
    }
}

发表于 2018-06-06 22:21:22 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        while(input.hasNext()){
            int n=input.nextInt();
            int[] x=new int[n];
            int[] y=new int[n];
            for(int i=0; i<n; i++)
                x[i]=input.nextInt();
            for(int i=0; i<n; i++)
                y[i]=input.nextInt();
            int min=x[0]+y[0];
            for(int i=1; i<n; i++){
                int temp=x[i]+y[i];
                if(temp<min)
                    min=temp;
            }
            System.out.println(min-2);
        }
    }
}

发表于 2018-05-22 09:46:03 回复(0)
#include<iostream>
#include<vector>
using namespace std;

int main(){
    
    int num;
    cin >> num;
    vector<vector<int>> points(num,vector<int>(2));
    
    for(int i=0;i<num;i++)
        cin >> points[i][0];
    
    for(int i=0;i<num;i++)
        cin >> points[i][1];
    
    int minDis = 2000;
    
    for(int i=0;i<num;i++){
        
        minDis = min( minDis,(points[i][0]-1)+(points[i][1]-1) );
        
    }
    cout << minDis << endl;
}
发表于 2018-02-09 13:45:08 回复(0)
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int minm;
    int x[n],y[n];
    for(int i =0;i<n;i++)
         cin >> x[i];
    for(int i=0;i<n;i++)
        cin >> y[i];
    minm=abs(x[0]-1)+abs(y[0]-1);
    for(int i=1;i<n;i++)
        if((abs(x[i]-1)+abs(y[i]-1))<minm)
        minm=abs(x[i]-1)+abs(y[i]-1);
    cout << minm << endl;
    return 0;
}

发表于 2018-01-10 15:52:43 回复(1)
#include <bits/stdc++.h>

using namespace std;

int main()
{     int n,dp[1010][1010],x[1010],y[1010];     while(cin>>n)     {         int Min = INT_MAX;         for(int i=0;i<n;i++)             cin>>x[i];         for(int i=0;i<n;i++)         {             cin>>y[i];             if(x[i]+y[i]-2 < Min)                 Min = x[i]+y[i]-2;                             cout<<Min<<endl;     }     return 0;
}

发表于 2017-12-30 01:43:04 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int[] xs=new int[n];
        int[] ys=new int[n];
        for(int i=0;i<n;i++)
            xs[i]=scanner.nextInt()-1;
        for(int i=0;i<n;i++)
            ys[i]=scanner.nextInt()-1;
        int min=Integer.MAX_VALUE;
        for(int i=0;i<n;i++){
            if(xs[i]+ys[i]<min)
                min=xs[i]+ys[i];
        }
        System.out.println(min);
    }
}


编辑于 2017-09-30 15:40:54 回复(0)
我想问两个问题,这道题排名第一9ms 8028k  第100名28ms 475k
第一的代码看完后,我想问运行速度快是因为输入的方式不一样吗,还是什么原因,我使用的是Scanner。
第100名 内存使用极少,我看了代码和我的结构基本一样,我分别使用他的代码测试,在牛客网内存都是9000多K,运行50ms,想问内存和什么有关,为什么他的测试数据是400多k,因为电脑配置不一样吗?因为对内存不了解,请赐教。

发表于 2017-09-13 21:22:41 回复(0)

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] xi=new int[n+1];
int[] yi=new int[n+1];
for(int i=1;i<n+1;i++){
xi[i]=in.nextInt();
}
for(int k=1;k<n+1;k++){
yi[k]=in.nextInt();
}
in.close();
int[] number=new int[n+1];
for(int i=1;i<n+1;i++){
number[i]=xi[i]+yi[i]-2;
}
int total;
int count=0;
int j=1;
for(int h=2;h<n+1;h++){
if(number[j]>number[h]){
j=h;
                          }
}
total=number[j];
System.out.print(total);
}

}

发表于 2017-09-12 17:40:55 回复(0)
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
//设置计算秒数的全局变量
int sco = 0;
Scanner sc = new Scanner(System.in);
while(true)
{
//n是有几个陷阱
int n = Integer.parseInt(sc.nextLine());
//设置存放秒数的数组
int[] arr = new int[n];
//设置陷阱横坐标
int[] x = new int[n];
//设置陷阱纵坐标
int[] y = new int[n];
String ax = sc.nextLine();
String[] arrayX = ax.split(" ");
String ay = sc.nextLine();
String[] arrayY = ay.split(" ");
//将坐标放入到陷阱坐标里面
for(int i=0;i<x.length;i++)
{
x[i] = Integer.parseInt(arrayX[i]);
}
for(int i=0;i<y.length;i++)
{
y[i] = Integer.parseInt(arrayY[i]);
}
//计算最短秒数
for(int i=0;i<n;i++)
{
arr[i] = x[i]+y[i]-2;
}
//排序,最小秒数在最前面
for(int i=0;i<arr.length;i++)
{
for(int j=i;j<arr.length;j++)
{
if(arr[i]>=arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
sco = arr[0];
break;
}
System.out.println(sco);
}
}

发表于 2017-09-07 14:01:50 回复(0)