主题:第39次编程比赛题目
ccpp [专家分:9360] 发布于 2006-08-24 14:37:00
第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 楼
bloodybg [专家分:1510] 发布于 2006-08-24 17:34:00
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 楼
孤独的猫 [专家分:3370] 发布于 2006-08-24 19:03:00
#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 楼
天国龙 [专家分:490] 发布于 2006-08-24 19:09:00
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 楼
jxstudying [专家分:280] 发布于 2006-08-24 19:43:00
/*第一题*/
/*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 楼
hyl084 [专家分:0] 发布于 2006-08-24 21:03:00
第一题:
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 楼
xyhx [专家分:0] 发布于 2006-08-24 21:14:00
第一题:
我用了基于三路划分的快速排序来排列整个数组,该方法是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 楼
火海时代 [专家分:230] 发布于 2006-08-24 21:41:00
#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 楼
gohan [专家分:30] 发布于 2006-08-24 21:59:00
#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 楼
gohan [专家分:30] 发布于 2006-08-24 22:12:00
#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 楼
SonicLing [专家分:6260] 发布于 2006-08-25 00:24:00
#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;
}
我来回复