三个查找题目,做的还是比较顺利,一次性被服务器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;
}