解题思路:
首先题目要求至少一半以上的州才能竞选成功,这里我们就直接取--(N/2+1),然后要求一半一以上的选民投票才能竞选成功,题目问至少需要多少选票,这里就需要我们将N个州的选民数进行升序排列,去前面的---(N/2+1)个州,每个州取---(a[i]/2+1);因此需要一个升序排列函数,这里我用了两种方法来写;
注意事项:
第一种方法我的升序排列函数里面的for循环要注意,这里是用的冒泡方法,一开始我的值没取对,排序出来的结果老是有0值;
for(i=0;i<n;i++) { for(j=0;j<=n-i-2;j++)//这里的条件要搞清楚 { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } }
在我的第一种方法中,我一开始很蠢的,也是很直观的看到州的个数好像有奇偶之分,于是我在计算投票总数的时候考虑到了这个;但是这对最终的结果没有影响,系统还是AC了;
int sum=0; if(n%2!=0){ for(i=0;i<(n+1)/2;i++) { sum=sum+(a[i]/2+1); } printf("%d\n",sum); } else if(n%2==0){ for(i=0;i<(n/2+1);i++) { sum=sum+(a[i]/2+1); } printf("%d\n",sum); }
在第二种方法中,直接用了指针的方法,进行数组比较,代码很简洁明了;
int cmp(const void *a,const void *b) { return *(int*)a-*(int*)b;//大于返回1,等于返回0,小于返回-1; }
在后面的main函数中我也优化了州的取法,直接用---(N/2+1)后面的代码优化了;
参考代码:
第一种方法:
void ascending(int n)//复杂的升序排列; { int a[101]; int i,j,k; int temp; // scanf("%d",&n); for(k=0;k<n;k++) { scanf("%d",&a[k]); } for(i=0;i<n;i++) { for(j=0;j<=n-i-2;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } int sum=0; if(n%2!=0){ for(i=0;i<(n+1)/2;i++) { sum=sum+(a[i]/2+1); // printf("%d ",a[i]); } printf("%d\n",sum); } else if(n%2==0){ for(i=0;i<(n/2+1);i++) { sum=sum+(a[i]/2+1); } printf("%d\n",sum); } } //核心函数 void total(int n) { int i,sum=0; int a[101]; if(n<=2) { for(i=0;i<n;i++) { scanf("%d",&a[i]); sum=sum+(a[i]/2+1); } printf("%d\n",sum); } else if(n%2==0) { ascending(n);//进行升序排列,取前面(n/2+1)个州,然后将这些州的人数除以2再加一求总和就可以; } else if(n%2!=0) { ascending(n);//进行升序排列,取(n+1/2)个州,然后将这些州的人数除以2再加一求总和就可以了; } } int main() { int n; while(scanf("%d",&n)!=EOF)//州的总数,输入的值为-1时则跳出循环 { if(n==0) break; else { total(n); } } return 0; }
第二种方法:
int cmp(const void *a,const void *b)//数组比较函数 { return *(int*)a-*(int*)b; } int main() { int N,i; while(scanf("%d",&N)!=EOF&&N!=0) { int a[N]; for(i=0;i<N;i++) { scanf("%d",&a[i]); } qsort(a,N,sizeof(int),cmp); N=N/2+1; int sum=0; for(i=0;i<N;i++) { sum+=a[i]/2+1; } printf("%d\n",sum); } return 0; }
如果大家有什么想指正的,欢迎留言,谢谢!
我也是小白一枚哦!
0.0分
2 人评分