zoukankan      html  css  js  c++  java
  • 算法学习--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;
    }
  • 相关阅读:
    理解C++类 this 指针的例子
    C++ const修饰符
    C++遍历循环多维数组
    C++ begin()和end()
    动态规划——最大子串和
    matlab 和 origin作图去除白边,字体调节
    求字符串中的某个子串重复次数
    mysql的 join联合查询的通俗解释
    java正则表达式常用实例——借鉴思路
    注册表的简单使用
  • 原文地址:https://www.cnblogs.com/Pinging/p/8867721.html
Copyright © 2011-2022 走看看