回 帖 发 新 帖 刷新版面

主题:第39次编程比赛题目

第1题:
    半数问题,给定整型数组vote[], 其大小为n,数组中任一元素均为自然数i(i = 1,2,3,...)。
规定函数接口:int Majority (int vote[], int n)
    在vote[]中,可能存在一个自然数i,其个数m 超过半数,即m > n/2。若存在这样的i,函数Majority返回m,否则函数返回0。
例:
    vote[5] = {1,8,1,100,1}; 其大小为 5。
    因为自然数1的个数为3,超过半数,那么调用Majority将返回 3。
题目要求:编写规定函数接口 Majority。



赠送题:
    已知f[]和g[]两个数组,大小分别为m和n,其中的元素都已经从小到大排列,且每个数组内的元素都各不相同。
规定函数接口:int Count (int f[], int g[], int m, int n)
    函数Count返回两个数组中有多少组元素相同。
例:
    f[5] = {1,3,4,7,9}, g[4] = {3,5,7,8};
    因为只有2组元素相同,分别是f[1]与g[0] 和 f[3]与g[2],所以函数Count的返回值应为2。 
题目要求:编写规定函数接口Count。

回复列表 (共57个回复)

21 楼

int arrayNum = 0;

int gpp(int a[], int n)
{
    for (int i = 0; i < arrayNum; i++)
    {
        if (n == a[i])
            return i;
    }
    return -1;
}

int Majority(int vote[], int n)
{
    int *a, *b;
    a = (int*)malloc(sizeof(int)*n);
    b = (int*)malloc(sizeof(int)*n);
    for (int j = 0; j < n; j++)
    {
        b[j] = 0;
    }
    int m = 0;
    int temp;
    for (int i = 0; i < n; i++)
    {
        temp = gpp(a, vote[i]);
        if (-1 == temp)
        {
            a[arrayNum] = vote[i];
            b[arrayNum]++;
            if (b[arrayNum] > m)
                m = b[arrayNum];
            arrayNum++;
            if (arrayNum > n/2)
                return 0;
        }
        else
        {
            b[temp]++;
            if (b[temp] > m)
                m = b[temp];
        }
    }
    if (m > n/2)
        return m;
    else
        return 0;
}

22 楼

#include <stdio.h>
#include <MALLOC.H>


int Majority (int vote[], int n)
{
        int temp;          
    int *b1,*b2;
    int t=0;           /*有多少数字入选*/
    int i,j;           /*临时变量*/
    int founded=1;     /*记录是否需要将添加新的数值*/
        int res=0;         /*返回值*/

    temp=(n%2==0?n/2:(int)(n/2)+1);
        b1=(int *)malloc(temp*sizeof(int));
    b2=(int *)malloc(temp*sizeof(int));

    for(i=0;i<temp;i++)
    {
            for(j=0;j<t;j++)
        {
               if(*(b1+j)==vote[i])
          {
              (*(b2+j))++;
              founded=0;
              break;
          }
         }

       if(founded)
       {
           *(b1+t)=vote[i];
           *(b2+t)=1;
           t++;
       }
       founded=1;
    }

    for(i=temp;i<n;i++)
    {
            for(j=0;j<t;j++)
       {
                  if(*(b1+j)==vote[i])
          {
              (*(b2+j))++;
              break;
          }
       }
    }
    


    for(i=0;i<t;i++)
   {
       if(*(b2+i)>n/2)
       {
           res=*(b2+i);
           break;
       }
    
     }
    free(b1);
    free(b2);

    return res;


}

int Count (int f[], int g[], int m, int n)
{
     int fpos=0,gpos=0,res=0;/*fpos为f[]的当前位置,gpos为g的,res为返回值*/
     while(fpos<m&&gpos<n)
     {
         if(f[fpos]==g[gpos])
         {
             res++;
             fpos++;
             gpos++;
         }
         else if(f[fpos]>g[gpos])
         {
             gpos++;
         }
         else
         {
             fpos++;
         }
    }

     return res;

}



初学者,献丑了:)~~

23 楼

int Majority(int vote[], int n)
{
    int rep,s,i,j,s1,s2;
    int *p;
    double temp;
    s=(n+1)/2;
    temp=n/2;
    p=new int[s];
    for(i=0;i<s;i++)
        p[i]=1;
    s1=0;
    s2=0;
    rep=0;
    for(i=0;i<s;i++)
    {
        if (p[i])
            for(j=i+1;j<n;j++)
                if (vote[i]==vote[j])
                {
                    p[i]++;
                    if (j<s)
                        p[j]=0;
                    else s1++;
                }
        if (p[i]>temp)
        {
            rep=p[i];
            break;
        }
        s2+=p[i];
        if (n-i-s1<=temp || n-s2<=temp)
            break;
    }
    return rep;
}

24 楼

/*第一题*/
/*Dev c++ 编译环境中实现*/

#include<stdio.h>
#include<stdlib.h>

int Majority(int vote[],int n)

{
    int i,j,m, num[n];        /*num[n]记录数组vote[]中每个数出现的次数,
                               并确定次数最大的数在数组vote[]中的位置*/ 
    for(i=0; i < n; i++)      /*对数组赋初值,记每个数为1次*/ 
       num[i]=1;                              
    for (i = 0; i < n; i++)  /*扫描数组,当数组中有相同的数出现时,其
                               后一个置特殊数0,并计数加1*/ 
       if (vote[i]!=0)        /*0为标记*/ 
         for (j = i+1; j < n; j++)
            if (vote[j] == vote[i])
            {  
               vote[j] = 0; 
               num[i] += 1;
            }
      
       
    m = num[0];
    
    for (i = 0; i < n; i++)
     
         if (num[i] != 1 && num[i] > m) /*初始值为1,为减少比较次数 
                                          用了num[i] != 1*/
          m = num[i];
     
    if (m > n/2) 
        return m;
    else  return 0;      
          
}          

/* 示例,结果输出7*/ 

int main()
{
    int vote[10] = {2,2,2,2,2,2,6,8,4,2};
    int i;
    i = Majority(vote,10);
    
    printf("Majority return %d", i);
    system("pause");
    
    return 0;
}    

当vote[10] = {1,2,3,4,5,5,5,5,7,8}时 输出 0;

谢谢批阅并指出不妥和值得改进的地方!感激不尽...

25 楼

第一题:
int Majority (int vote[], int n){
    bool flag=0;
    int k=n;
    //先对该数组进行冒泡排序
    while(k){
        flag=0;
        for(int i=1;i<n;i++){
            if(vote[i-1]>vote[i]){
                vote[i-1]=vote[i-1]+vote[i];
                vote[i]=vote[i-1]-vote[i];
                vote[i-1]=vote[i-1]-vote[i];
                flag=1;
            }
        }
        if(flag==0)
            break;
        else
            k--;
    }
    int temp=vote[0],num(0);
    for(int j=0;j<n;j++){
        if(temp==vote[j])
            num++;//统计个数
        else{
            if(num>n/2)
                return num;
            else{
                temp=vote[j];//继续用vote[j]进行比较
                num=1;//该数已存在1个
            }
        }
    }
    if(num>n/2)
        return num;
    else
        return 0;
}

26 楼

第一题:
    我用了基于三路划分的快速排序来排列整个数组,该方法是Bentley首先发明的:
将左边子数组中碰到的与划分元素相等的数组元素放到数组的左端,将右边子数组中碰到的与划分元素相等的数组元素放到数组的右端.
-------------------------------------
┊等于┊小于┊ 〓〓 ┊大于 ┊等于┊ v┊
-------------------------------------
li    p     i       j      q        ri
从左开始扫描,查找不小于划分元素v的元素;从右边开始扫描,查找不大于v的元素,然后交换它们。如果左边的元素在交换后等于划分元素v,则将它与数组左端的元素交换,右边也如此。当指针交叉时,交换arr[i]和arr[ri](即v),然后交换等于它的值,并把它们放到位。


//环境:XPsp2+vc6.0
#define exch(A,B) {int t=A;A=B;B=t;}   //交换两数
/*基于三路划分的快速排序:排序整形数组;
  入口参数:整形数组首地址,及其左右索引号;
  返回值:无。
*/
void QuickSort(int arr[],int li,int ri)
{
    int i,j,k,p,q; //p和q分别用来记住左右子数组中与v相等的索引值
    int v;   //划分元素的值
    if(ri<=li)
        return;
    v=arr[ri];
    i=li-1;
    j=ri;
    p=li-1;
    q=ri;    
    for(;;)
    {
        while(arr[++i]<v)
            ;
        while(v<arr[--j] &&j!=li)
            ;            
        if(i>=j)
            break;        
        exch(arr[i],arr[j]);
        if(arr[i]==arr[ri])
        {
            p++;
            exch(arr[p],arr[i]);
        }
        if(v==arr[j])
        {
            q--;
            exch(arr[q],arr[j]);
        }
    }
    exch(arr[i],arr[ri]);
    j=i-1;
    i++;
    //交换与v相等的元素
    for(k=li;k<p;k++,j--)
        exch(arr[k],arr[j]);
    for(k=ri-1;k>q;k--,i++)
        exch(arr[k],arr[i]);    
    QuickSort(arr,li,j);
    QuickSort(arr,i,ri);
}
int Majority (int vote[], int n)
{
    int i,j;
    QuickSort(vote,0,n-1);
    for(i=0;i<=n/2;) //当i>n/2时,满足条件的个数必小于n/2;
    {
        for(j=i+1;vote[j]==vote[i] && j<n;j++)
            ;
        if(j-i>n/2)
            return j-i;
        i=j;
    }
    return 0;
}

27 楼

#include <iostream>
using namespace std;

int Majority (int vote[], int n)
{
    int a = n/2;
    int i;
    while(1)
    {
        int count = 0;
        int temp;
        for(i = 0; i < n; i++)
            if(vote[i]>=0)
                if(!count)
                {
                    count++;
                    temp = vote[i];
                    vote[i] = -1;
                }
                else if(vote[i]==temp)
                {
                    count++;
                    vote[i] = -1;
                }
        if(count > a)
            return count;
        else if(!count)
            return 0;
    }
}

int main(void)
{
    int vote[5] = {1,8,1,100,1};
    cout << Majority(vote,5) << endl;
    return 0;
}

28 楼

#include <iostream>
#include <set>

using namespace std;
set<int> *filter= new set<int>;

int Majority(int vote[], int n){
    for(int i=0;i<n;++i){
      if (vote[i]<=0) continue;
      else filter->insert(vote[i]);
    } 
    return filter->size()>(double)(n/2)?filter->size():0;
}

如果0不算自然数 就这样,用了set.也可以自己写把
送的题稍后再看

29 楼

#include <iostream>


using namespace std;


int Count (int f[], int g[], int m, int n)
{
    int _count=0;
    for (int i=0,j=0;i<m&&j<n;){
      if(f[i]<g[j]) i++;
      else if(f[i]>g[j]) j++;
      else {_count++;i++;j++;}
    }
    return _count;
}
//int 赠送

30 楼


#include <vector>
#include <algorithm>

int Majority (int vote[], int n)
{
    static std::vector<int> v;
    v.resize(n);
    std::copy(vote, vote+n, v.begin());
    std::sort(v.begin(), v.end());
    int count = 0;
    for(int i=0; i<n/2; i++)
    {
        if(v[i] != v[i+(n/2)]) continue;
        count = (n/2)+1;
        for(int j=i+count; j<n; j++)
        {
            if(v[i] == v[j]) count++;
            else break;
        }
        break;
    }
    return count;
}

int Count (int f[], int g[], int m, int n)
{
    int fi = 0, gi = 0, count = 0;
    while(fi < m && gi < n)
    {
        if     (f[fi] > g[gi]) gi++;
        else if(f[fi] < g[gi]) fi++;
        else {count++; fi++; gi++;}
    }
    return count;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册