站队问题

来源:互联网 发布:php怎么开启exec函数 编辑:程序博客网 时间:2024/05/17 06:11

题目:

有一条很长的队伍,队伍里面一共有n个人。所有的人分为三类:警察,小偷和普通人。将队伍里面的人从前到后由1到n编号,编号为i的人与编号为j的人的距离为i与j之差的绝对值。

每一个警察有一个能力值x,表示他能够监视与他距离不超过x的所有人,小偷被警察发现当且仅当他被一个或多个警察监视到。你知道在整条队伍中,一共有多少个小偷会被警察发现吗?

其中:x代表小偷,#是平民,数字代表警察的能力。

输入

9

x1x#2x#xx

输出

3


官网上给的c解答:

#include <bits/stdc++.h>#define maxn 100009using namespace std;int n;char s[maxn];bool vis[maxn];int main(){    scanf("%d", &n);    scanf("%s", s);    memset(vis, 0, sizeof(vis));    for(int i = 0; i < n; i++){        if(s[i] == 'X' || s[i] == '#')            continue;        int x = s[i] - '0';        for(int j = 0; j <= x; j++){            if(i - j >= 0)                vis[i - j] = 1;            if(i + j < n)                vis[i + j] = 1;        }    }    int ans = 0;    for(int i = 0; i < n; i++){        if(s[i] == 'X' && vis[i])            ans++;    }    printf("%d\n", ans);    return 0;}


我当时做题的时候用的JAVA,想法也都差不多吧,开始的时候没有获得正确的char转int值,所以一直没通过,后来改了,自己测了几次,都是对的,但是判题给的是30%的通过率,感觉自己想法跟官网的差不多,可能还是差一点点吧。

/** * @time     下午6:38:55 * @author   Lilylee * @version  1.0 * @email    lilylee_1213@foxmail.com * TODO */package jingdong;import java.util.Scanner;public class Main {public static void main(String[] args) { Scanner sc = new Scanner(System.in);     int num = sc.nextInt();     String str = sc.next(); int number=Main.fun(num, str); System.out.println(number);}public static int fun(int num,String str){int number=0;char [] ca=new char[num];int [] cap=new int[num];for(int i=0;i<num;i++){ca[i]=str.charAt(i);if(Character.isDigit(ca[i])){cap[i]=Character.getNumericValue(ca[i]);}else cap[i]=-1;}for(int i=0;i<num;i++){if(cap[i]>0){for(int j=1;j<=cap[i];j++){int k=i-j;int h=i+j;if(k<0) k=0;if(h>num-1) h=num-1;if(ca[k]=='x'){ca[k]='#';number++;}if(ca[h]=='x'){ca[k]='#';ca[h]='#';number++;}}}}return number;}}


0 0
原创粉丝点击