算法学习--Day4

今天写了两章题目,仍然是比较基础的内容。感觉时间好紧张,怕来不及,所以以后要加快速度了。

今天写的最多的是查找类题目,关键是二分查找的掌握。

题目描述

输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。

输入描述:

测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。

输出描述:

对于每组输入,请输出结果。
示例1

输入

2
1 3
0

输出

-1

#include <stdio.h>

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        int array[201];
        for(int i=0;i<n;i++) scanf("%d",&array[i]);
        int p;
        int fin=-1;
        scanf("%d",&p);
        for(int i=0;i<n;i++) {
            if(array[i]==p) {
                fin=i;
                break;}
            }
            printf("%d",fin);
        }
    return 0;
    }

题目描述

输入数组长度 n 输入数组      a[1...n] 输入查找个数m 输入查找数字b[1...m]   输出 YES or NO  查找有则YES 否则NO 。

输入描述:

输入有多组数据。
每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。

输出描述:

如果在n个数组中输出YES否则输出NO。
示例1

输入

5
1 5 2 4 3
3
2 5 6

输出

YES
YES
NO

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

//int find(int num,int buf[],int n){
//    int ans=-1;
//    int base=0;
//    int top=n-1;
//    while (top>=base){
//        int mid = buf[(top+base)/2];
//        if (mid==num) {ans=1;
//            break;}
//        if(mid>num){
//            top=mid-1;
//        }
//        if(mid<num){
//            base = mid+1;
//        }
//
//    }
//    return ans;
//}
//
//int main(){
//    int n;
//    while (scanf("%d",&n)!=EOF){
//        int buf[101];
//        int m;
//        for(int i=0;i<n;i++){
//
//            scanf("%d",&buf[i]);
//        }
//        sort(buf,buf+n);
//        int buf2[101];
//        scanf("%d",&m);
//        for(int i=0;i<m;i++) scanf("%d",&buf2[i]);
//        for(int j=0;j<m;j++){
//            int fin = find(buf2[j],buf,n);
//            if(fin==1)  printf("YES
");
//            else printf("NO
");
//        }
//    }
//
//    return 0;
//}


int main(){
    int n;
    while (scanf("%d",&n)!=EOF){
        int buf[101];
        for (int i = 0; i <101 ; ++i) buf[i]=0;
        for (int i = 0; i <n ; ++i) {
            int cut ;
            scanf("%d",&cut);
            buf[cut]=1;
        }
        int m;
        scanf("%d",&m);
        for (int j = 0; j < m; ++j) {
            int c ;
            cin>>c;
            if(buf[c]==1) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
    }
}

这个题目我要重点说一下,我注释掉的代码是使用二分查找来做的,但是由于使用搜索过于复杂。。导致我的题目没给ac,所以换之前使用的哈希的思想去做了。就当做练手了。

题目描述

在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数, 或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。

输入描述:

第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。

输出描述:

每个案例输出为n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔。
示例1

输入

10
10 12 12 11 11 12 23 24 12 12

输出

0 7


#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
    int n;
    while (scanf("%d",&n)!=EOF){
        int buf[81];
        for (int i=0;i<n;i++) cin>>buf[i];
        if(buf[0]!=buf[1]) cout<<0<<" ";
        for (int j = 1; j < n-1; ++j) {
            if((buf[j]>buf[j-1]&&buf[j]>buf[j+1])||(buf[j]<buf[j-1]&&buf[j]<buf[j+1])) cout<<j<<" ";

        }
        if(buf[n-1]!=buf[n-2]) cout<<n-1;
    }
    return 0;
}

题目描述

输入N个学生的信息,然后进行查询。

输入描述:

输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:
02
03
01
04

输出描述:

输出M行,每行包括一个对应于查询的学生的信息。
如果没有对应的学生信息,则输出“No Answer!”
示例1

输入

4
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
5
02
03
01
04
03

输出

02 刘唐 男 23
03 张军 男 19
01 李江 男 21
04 王娜 女 19
03 张军 男 19

#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct E{
    char number[50];
    char name[100];
    char sex[5];
    int age;
};
bool cmp(E a,E b){
    int fin = strcmp(a.number,b.number);
    return fin<0;
};
int find(E buf[],char goal[],int n){
    int base=0;
    int top=n-1;

    while (top>=base){
        int mid = (base+top)/2;
        int cut = strcmp(goal,buf[mid].number);
        if(cut==0) {cout<<buf[mid].number<<" "<<buf[mid].name<<" "<<buf[mid].sex<<" "<<buf[mid].age<<endl; return mid;
            break;}
        if(cut>0) base = mid+1;
        if(cut<0) top = mid-1;
    }
    cout<<"No Answer!"<<endl;
    return -1;
}

int main(){
    int n;
    while (scanf("%d",&n)!=EOF){
        E stu[1001];
        for (int i = 0; i < n; ++i) {
            cin>>stu[i].number>>stu[i].name>>stu[i].sex>>stu[i].age;
        }
            sort(stu,stu+n,cmp);

            int m;
            cin>>m;

            for (int j = 0; j < m; ++j) {
                char stunum[50];
                //scanf("%s",stunum);
                cin>>stunum;
                //cout<<stunum;
                find(stu,stunum,n);
            }




    }
    return 0;
}
原文地址:https://www.cnblogs.com/Pinging/p/8867721.html