您的位置:首页 > 其它

【九度】题目1375:陈博的完美主义(25分)

2014-05-19 10:30 253 查看
题目1375:陈博的完美主义(25分)

时间限制:1 秒内存限制:32 兆特殊判题:否提交:1083解决:267

题目描述:

上一回合大家都知道,在JOBDU团队里,陈博是最讲平均主义的人,对数字十分敏感。事实上,他还是个数字完美主义者。例如看到N个数字的时候,从1到N的每个数都需要在其中出现且仅出现一次,否则他就觉得这个数字序列不完美。后来,我明白了:这是排列!

对于一个整数序列d1, d2, d3 ... dn,你是否能够算出至少改变其中的几个数,才能把他们变成从1到N的一个排列?例如,对于整数序列 3, 2, 2,我们只需要将其中的一个2改为1就能得到一个从1到3的排列:3, 1, 2

输入:

每个测试文件包含多个测试案例,每个测试案例两行,第一行包括一个整数N,代表整数序列的长度,第二行是以空格隔开的N个整数,代表该整数序列。其中我们能保证1 <= N <= 10^5,每个整数的长度不超过100.

输出:

对于每个整数序列,输出一行,包含一个整数,表明至少要改变该整数序列的多少个数才能得到一个从1到N的排列。

样例输入:

3

3 2 2

1

1

样例输出:

1

0

答疑:

解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-8098-1-1.html

【解题思路】

1、声明一个长度为100002大小的数组,用来标记下标为i的数字是否出现过。

2、如果数据长度比maxLen = 6大,那么就num++,因为数据值不在1到n之间。

3、如果长度不大于maxLen,就判断是否在1和n之间,如果不在,num++;

4、接下来,如果在1和n之间,判断是否已经出现过,出现过,num++,否则numArr[tempNum] = 1,标记该数据已经出现了。

最后输出即是结果。

Java AC

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
 
public class Main {
    /*
     *2014年5月19日10:25:09
     */
    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;
            int numArr[] = new int[n+1];
            int num = 0;
            for (int i = 0; i < n; i++) {
                st.nextToken();
                int tempNum = (int) st.nval;
                if(tempNum == Integer.MAX_VALUE || tempNum < 1 || tempNum > n){
                    num++;
                }else {
                    if (numArr[tempNum] == 0) {
                        numArr[tempNum] = 1;
                    }else {
                        num++;
                    }
                }
            }
            System.out.println(num);
        }
    }
}
 
/**************************************************************
    Problem: 1375
    User: wangzhenqing
    Language: Java
    Result: Accepted
    Time:590 ms
    Memory:29504 kb
****************************************************************/


C++ AC

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
const int maxn = 100002;
const int maxm = 102;
const int maxLen = 6;
int n, i;
char s[maxm];
int numArr[maxn];
int num;
int main(){
    while(scanf("%d", &n) != EOF){
        num = 0;
        memset(numArr, 0, sizeof(numArr));
        for(i = 0; i < n; i++){
            scanf("%s", s);
            if(strlen(s) > maxLen){
                num++;
                continue;
            }
            int tempNum = atoi(s);
            if(tempNum < 1 || tempNum > n){
                num++;
                continue;
            }
            if(numArr[tempNum] == 0){
                numArr[tempNum] = 1;
            }else{
                num++;
            }
        }
        printf("%d\n", num);
    }
    return 0;
}
/**************************************************************
    Problem: 1375
    User: wangzhenqing
    Language: C++
    Result: Accepted
    Time:150 ms
    Memory:1412 kb
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: