原题链接:程序员的总统梦
解题思路:
首先题目要求至少一半以上的州才能竞选成功,这里我们就直接取--(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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复