zoukankan      html  css  js  c++  java
  • 1059. C语言竞赛

    C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:

    1. 冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
    2. 排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
    3. 其他人将得到巧克力。

    给定比赛的最终排名以及一系列参赛者的ID,你要给出这些参赛者应该获得的奖品。

    输入格式:

    输入第一行给出一个正整数N(<=10000),是参赛者人数。随后N行给出最终排名,每行按排名顺序给出一位参赛者的ID(4位数字组成)。接下来给出一个正整数K以及K个需要查询的ID。

    输出格式:

    对每个要查询的ID,在一行中输出“ID: 奖品”,其中奖品或者是“Mystery Award”(神秘大奖)、或者是“Minion”(小黄人)、或者是“Chocolate”(巧克力)。如果所查ID根本不在排名里,打印“Are you kidding?”(耍我呢?)。如果该ID已经查过了(即奖品已经领过了),打印“ID: Checked”(不能多吃多占)。
    输入样例:

    6
    1111
    6666
    8888
    1234
    5555
    0001
    6
    8888
    0001
    1111
    2222
    8888
    2222
    

    输出样例:

    8888: Minion
    0001: Chocolate
    1111: Mystery Award
    2222: Are you kidding?
    8888: Checked
    2222: Are you kidding?
    

    解题思路:

    分析题意,最后要查找 ID 对应的排名。可如果数据很多,怎么查找最快?

    二分查找!时间复杂度 O(logN)!

    二分查找的要求是数据是有序的,所以这里可以用快速排序 (qsort),先将其按顺序排列。

    可不可以再快点?

    当然可以。
    参赛者的 ID 由四位数字组成,则范围为 0-9999。那就把这当作数据下标呗。将输入的数据「一个萝卜一个坑」的放进去,等输入结束,他们就已经是有序的了。省去了排序的过程。不过也增加了空间的复杂度。

    相应地,查找也变成了 O(1)。比二分更快。

    本文代码使用了后者的思路。

    解题代码:

    #include<stdio.h> 
    
    int isPrime (int i);
    
    int main() 
    {	 
    	int N;
    	scanf("%d", &N);
    	int a[100001] = {0};
    	for (int i=0; i<N; i++) {		
    		int temp;
    		scanf("%04d", &temp);
    		a[temp] = i + 1;
    	}
    	int K;
    	scanf("%d", &K);
    	for (int i=0; i<K; i++) {
    		int temp;
    		scanf("%04d", &temp);
    		printf("%04d: ", temp);
    		if (a[temp] == -1) {
    			printf("Checked
    ");
    			continue;
    		}
    		if (a[temp] == 0) {
    			printf("Are you kidding?
    ");
    			continue;
    		}
    		if (a[temp] == 1) {
    			printf("Mystery Award
    ");
    			a[temp] = -1;
    			continue;
    		}
    		if (isPrime(a[temp])) {
    			printf("Minion
    ");
    			a[temp] = -1;
    			continue;
    		} 
    		printf("Chocolate
    ");
    	}
    	
    	return 0;
    } 
    
    int isPrime(int i) {
    	if (i == 2) {
    		return 1;
    	}
    	if (i % 2 == 0) {
    		return 0;
    	}
    	for (int j=2; j*j<=i; j++) {
    		if (i % j == 0) {
    			return 0;
    		}
    	}
    	return 1; 
    }
  • 相关阅读:
    nyoj 228士兵杀敌(五)
    hdu2072 单词数
    nyoj123士兵杀敌(四)(树状数组)
    nyoj1092数字分隔(二)
    HDU1166:敌兵布阵(线段树单点更新,区间查询)
    nyoj269VF(dp)
    nyoj 860又见01背包(01背包)
    poj2184(01背包变形)
    HDU2159FATE(完全背包变形)
    HDU4508 完全背包
  • 原文地址:https://www.cnblogs.com/andywenzhi/p/5864422.html
Copyright © 2011-2022 走看看