zoukankan      html  css  js  c++  java
  • 计蒜客第四场

    1、有序数组的中位数

    两组升序排列的数组A[m]和B[n], 求他们的中位数。  注意,中位数的概念哦~相信你会百度一下的~   

    格式:  第一行输入数字m,接下来一行输入数组A[m], 第三行输入数字n,第四行输入数组B[n],接下来输出中位数。两个数组的长度都不超过1000。 

    注意,需要保留5位小数哦~所以,你设计函数的时候请设计成double类型哦~

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    /*void combine(int a[],int n,int b[],int m,int c[],int num){
        int pa=0,pb=0,pc=0;
        while((pa<n)&&(pb<m)){
            if(a[pa]<=b[pb])
                c[pc++]=a[pa++];
            else
                c[pc++]=b[pb++];
        }
        while(pa<n)
            c[pc++]=a[pa++];
        while(pb<m)
            c[pc++]=b[pb++];
    }*/
    void combine(int a[],int n,int b[],int m,int c[],int num){
        //n,数组a的长度;m,数组b的长度;num,数组c的长度 
        int *pa,*pb,*pc,*pa_last,*pb_last; 
        pa=a;//pa指向a的首元素地址 
        pb=b;//pb指向b的首元素地址 
        pc=c;//pc指向b的首元素地址
        pa_last=a+n-1;//指向a的末尾 
        pb_last=b+m-1;//指向b的末尾 
        while((pa<=pa_last)&&(pb<=pb_last)){
            if(*pa<=*pb)
                *pc++=*pa++;
            else
                *pc++=*pb++;
        }
        while(pa<=pa_last)
            *pc++=*pa++;
        while(pb<=pb_last)
            *pc++=*pb++; 
    }
    int main(){
        int n,m,num;
        cin>>n;
        int a[n];
        for(int i=0;i<n;i++)
            cin>>a[i];
        sort(a,a+n);
        cin>>m;
        int b[m];
        for(int i=0;i<m;i++)
            cin>>b[i];
        sort(b,b+m);
        num=n+m;
        int c[num]={0};
        combine(a,n,b,m,c,num);
        for(int i=0;i<num;i++)
            cout<<c[i]<<" ";
        cout<<endl;
        if(num%2==0)
            printf("%0.5lf
    ",(double(c[(num-1)/2])+c[(num+1)/2])/2);
        else
            printf("%0.5lf
    ",double(c[(num-1)/2]));
        return 0;
    }

     2、回文质数

    因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。 写一个程序来找出范围[a,b](5 ≤ a < b ≤ 100000000)( 一亿)间的所有回文质数。 

    输入包括一行,分别为两个整数a和b。 

    输出一个回文质数的列表,一行一个。

    /*
    1.偶数位数回文数(除11)必定不是质数,所以只要运行到10000000。
    2.偶数肯定不是质数。
    
    首先,整个讨论中,要排除一个数, 
    那就是11,11是最小的回文数,而且还是质数。 
    
    除了这个数之外, 11的整倍数有一个性质,那就是奇数位上数字之和=偶数位上数字之和。 一个数,如果是偶数长度回文数,那么同一个数x,必然出现在一次奇数位一次偶数位,所以这个偶数长度回文数可以被11整除。 
     
    举例来说: 
    123321符合条件 
    123321其中1出现在第1和6位,2出现在第2和5位,3出现在第3和4位。 
    这个数一定能被11整除,123321÷11=11211
    
    综上所述:偶数位数回文数(除11)必定不是质数
    */
    #include<iostream>
    #include<stdio.h>
    #define M 10000000
    bool A[M];
    bool hw(int x){
        int y=x,num=0;
        while(y){
            num=num*10+y%10;
            y/=10;
        }
        if(num==x)
            return true;
        else
            return false;
    }
    void prime(int b){//筛法素数打表 
        int i,j;
        for(i=2;i<=b;i++){
            if(!A[i]){
                for(j=i+i;j<=b;j+=i)
                    A[j]=1;
            }
        } 
    }
    using namespace std;
    int main(){
        int a,b;
        cin>>a>>b;
        if(b>10000000)
            b=10000000; 
        prime(b);
        for(int i=a;i<=b;i++){
            if(hw(i)&&!A[i])
                cout<<i<<endl;
        }
        return 0;
    }

     3、快速排序算法

    #include<iostream>
    #define N 10
    using namespace std;
    void quickSort(int a[],int,int);
    int main()
    {
        int a[N];
        for(int i=0;i<N;i++)
            cin>>a[i];
        quickSort(a,0,N-1);
        for(int i=0;i<N;i++)
            cout<<a[i]<<" ";
        return 0;
    }
     
    void quickSort(int s[], int l, int r){
        if (l< r){      
            int i = l, j = r, x = s[l],t;
            while (i < j){
                while(i < j && s[j]>= x) // 从右向左找第一个小于x的数
                    j--; 
                if(i < j)
                    s[i++] = s[j];
                while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数
                    i++; 
                if(i < j)
                    s[j--] = s[i];
            }
            s[i] = x;
            quickSort(s, l, i - 1); // 递归调用
            quickSort(s, i + 1, r);
        }
    }

     4、出现次数最多的字符

    一个字符串中可能包含a~z中多个字符串,并且可能会有重复,如 String data ="abcdaaa",这道字符串出现次数醉倒的字母就是a,出现了4次。现在用户输入一个字符串,我们需要求出出现次数最多的字母,并且求出次数,如果存在字母中出现最多的次数不唯一,但所有出现次数最多的字母及次数都要打印出来。

    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    int main(){
        char a[1000], b[30] = { 0 };
        cin >> a;
        int charnum = strlen(a);
        int num[30] = { 0 }, sum = 0;
        b[0] = a[0];
        num[0] = 1; int j;
        for (int i = 0; i < charnum; i++){
            for ( j = 0; j < sum; j++){//查看之前是否有该字母,
                if (a[i] == b[j]){//有则对应+1
                    num[j]++;
                    break;
                }
            }
            if (j >= sum){
                b[sum] = a[i];
                num[sum++] = 1;
            }
        }
        int maxi = 0;//找到最多字母的下标
        for (int i = 0; i < sum; i++){
            if (num[i] > num[maxi])
                maxi = i;
        }
        for(int i=maxi;i<sum;i++)
            if(num[i]==num[maxi])//按照序列,如果有一样多的,则输出
                cout << b[i] << " " << num[i] << endl;
        return 0;
    }

     5、草药的价值

    辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

    #include "stdio.h"
    #include "iostream"
    using namespace std;
    int w[105], val[105];
    int dp[1005];
    int main()
    {
        int t,m,res=-1;    
        scanf("%d%d",&t,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&w[i],&val[i]);
        }
        for(int i=1;i<=m;i++) 
        {
            for(int j=t;j>=0;j--) 
            {
                if(j>=w[i])
                {
                    dp[j]=max(dp[j-w[i]]+val[i], dp[j]);
                }
            }
        }    
        printf("%d",dp[t]);
        return 0;
    }
  • 相关阅读:
    JS随笔
    tp5 redis 单例模式 转载
    分享我编程工作经历及对软件开发前景的看法
    redis详解(一)-- 概述
    redis详解(二)-- 数据类型详解
    redis详解(四)-- 高可用分布式集群
    redis详解(三)
    新工科平台
    关于Nginx的负载均衡
    微信退款回调
  • 原文地址:https://www.cnblogs.com/geziyu/p/9705055.html
Copyright © 2011-2022 走看看