查找

三个查找题目,做的还是比较顺利,一次性被服务器AC!


http://ac.jobdu.com/problem.php?pid=1126

/**
 * 1、定义的极值的下标包括0,与最后
 * 2、每组下标之间空格分开
 * 3、多组测试之间无空行
 * 4、数全相同怎么办呢?
 * 5、提交后AC了,说明了测试数据中必定都有极值。把4的情况排除了。
 *    题目没有给出没有极值的情况的反应,也暗示了是可处理的数据。
 **/
  
 #include <stdio.h>
  
 int main(){
    #ifdef ONLINE_JUDGE
    #else
    freopen("E:\\in.txt", "r", stdin);
    #endif
     
    int n;
    while (scanf("%d", &n) != EOF){
        while(n-- > 0){
            int k;
            scanf("%d", &k);
            int buf[100];
            for (int i=0; i<k; i++){
                scanf("%d", &buf[i]);
            }// k 个数据
             
            bool firstIndex = true;
            for (int i = 0; i <k; i++){
                if (i > 0 && i < k-1){
                    if ((buf[i] > buf[i-1] && buf[i] > buf[i+1])||(buf[i] < buf[i-1] && buf[i] < buf[i+1])){
                        if (firstIndex == true){
                            firstIndex = false;
                            printf("%d", i);
                        }
                        else
                            printf(" %d", i);
                    }// 判断,输出
                }
                else if (i == 0){
                    if (buf[0] != buf[1]){
                        if (firstIndex == true){
                            firstIndex = false;
                            printf("%d", i);
                        }
                        else
                            printf(" %d", i);
                    }
                }// 判断,输出
                else{
                    if (buf[k-1] != buf[k-2]){
                        if (firstIndex == true){
                            firstIndex = false;
                            printf("%d", i);
                        }
                        else
                            printf(" %d", i);
                    }
                }// 判断,输出
            }// 处理本组
            printf("\n");
        }// n 组数据
    }// while : zu
     
    return 0;
 }


http://ac.jobdu.com/problem.php?pid=1173

/**
 * 数组len:n
 * 格式:a[1...n]
 * 
 * 1、对于要查找的值,不必作为数组,读一个查一个即可。
 * 2、输入数据无序,先排序,二分查找
 * 3、没让输出数组小标,没必要按给定格式
 * 4、YES,NO后要换行
 **/
 
 #include <stdio.h>
 #include <algorithm>
 
 using namespace std;
 
 int main()
 {
	int n;
	while (scanf("%d", &n) != EOF){
		int buf[110];
		
		for (int i = 0; i < n; i++){
			scanf("%d", &buf[i]);
		} // read data
		
		sort(buf, buf+n);// sort
		
		int m;
		scanf("%d", &m);
		while(m-- > 0){
			int key;
			scanf("%d", &key);
			// 折半查找算法
			int high = n-1;
			int low = 0;
			int mid;
			while (low <= high){
				mid = (low + high)/2;
				if (buf[mid] == key){
					printf("YES\n");
					break;
				}
				else if(buf[mid] < key)
					low = mid + 1;
				else 
					high = mid - 1;
			}// while
			if (low > high)
				printf("NO\n");
			// 折半查找结束
		}// while
	}// while: zu
	return 0;
 }
 
 



 

http://ac.jobdu.com/problem.php?pid=1069

// 好多人说因为给id,name开的空间小错误了。但是测试id开10个是没有问题
// 名字要开100,所以给自己提个醒吧,开大点!你不知道服务那边的测试数据
// 多么变态!
//


/**
	//--资料库
	int n;
	struct S{
	int id; //例子给的是2为,但可能有几百学生,所以,学号位数不定,我们改为char *
	char name[20];
	char sex;
	int age;
	};
	
	//--查询
	int m;
	int ID;

*/

#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

struct S{
	char id[100]; //2 位, caution: print
	char name[20];
	char sex[5];
	int age;
	bool operator < (const S & A) const{
		return strcmp(id, A.id) < 0;
	}
} buf[1000];


int main(){
	int n;
	while (scanf("%d", &n) != EOF){
		for (int i = 0; i < n; i++){
			scanf("%s %s %s %d", &buf[i].id, &buf[i].name, &buf[i].sex, &buf[i].age);
		} // [0,n-1]
		
		int m;
		scanf("%d", &m);
		while (m-- > 0){
			int ID;
			scanf("%d", &ID);
			// 二分查找开始
			int high = n-1;
			int low = 0;
			int mid;
			while (low <= high){
				mid = (low + high)/2;
				if (strcmp(buf[mid].id, ID) ==0){
					printf("%s %s %s %d\n", buf[mid].id, buf[mid].name, buf[mid].sex, buf[mid].age);
					break;
					}
				else if(strcmp(buf[mid].id, ID) < 0){
					low = mid+1;
				}else {
					high = mid-1;
				}
			}// 二分查找结束
			if (low > high)//查找失败
				printf("No Answer!\n");
		}//while:查找
		
		sort(buf, buf+n); // 输入的内容不一定有序,我们要排序
	}//while :多组测试
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值