题目地址: http://ac.jobdu.com/problem.php?pid=1394
题目描述:
在任意一个数组当中,若你能找出有五个及五个以上的连续元素时,我们就称它为五连击数组。但是这种数组并不是时常会有,你的任务就是通过增加最少的元素,使一个数组成为一个五连击数组。
输入:
每个测试文件包含多个测试案例,每个测试案例包括两行。
第一行代表输入数组的元素个数N,其中0 < N <= 1000。
第二行则包含有N个非负整数,代表数组的元素。
输出:
对于每一个测试案例输出一行,代表最少需要添加的元素数,使得数组成为一个五连击数组。
样例输入:
3
1 3 4
1
1
样例输出:
2
4
答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-8117-1-1.html
【解题思路】
简化一下,其实题目意思就是求解数组中连续数字的最大长度。
针对每个数字判断,加1、2、3、4是否在数组中。统计缺失的数字个数,最小数既是答案。
Java AC
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
/*
* 1394
*/
public static void main(String[] args) throws Exception {
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
while (st.nextToken() != StreamTokenizer.TT_EOF) {
int n = (int) st.nval;
if (n < 0) {
break;
}
List<Integer> arrList = new ArrayList<Integer>();
int array[] = new int[n];
for (int i = 0; i < n; i++) {
st.nextToken();
array[i] = (int) st.nval;
arrList.add(array[i]);
}
Arrays.sort(array);
int min = 5;
for (int i = 0; i < n; i++) {
int count = 0;
for (int j = 1; j < 5; j++) {
if (arrList.contains(array[i]+j)) {
continue;
}else {
count++;
}
}
min = Math.min(min, count);
if(min == 0){
break;
}
}
System.out.println(min);
}
}
}
/**************************************************************
Problem: 1394
User: wangzhenqing
Language: Java
Result: Accepted
Time:80 ms
Memory:16224 kb
****************************************************************/
C++ AC
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 1002;
int n,i,j;
int array[maxn];
bool isTrue(int a){
for(int k = 0; k < n; k++){
if(array[k] == a){
return true;
}
}
return false;
}
int main(){
while(scanf("%d",&n) != EOF){
for(i = 0; i < n; i++){
scanf("%d",&array[i]);
}
sort(array,array+n);
int min = 5;
for(i = 0; i < n; i++){
int count = 0;
for(j = 1; j < 5; j++){
if(isTrue(array[i]+j)){
continue;
}else{
count++;
}
}
min = min < count ? min : count;
if(min == 0){
break;
}
}
printf("%d\n",min);
}
return 0;
}
/**************************************************************
Problem: 1394
User: wangzhenqing
Language: C++
Result: Accepted
Time:0 ms
Memory:1024 kb
****************************************************************/