OJ题当总统

探讨了小明为了成为丑国总统所面临的数学问题,即如何计算至少需要赢得多少选民支持才能当选。解析了算法实现,强调了正确的逻辑流程,避免了不必要的复杂代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

 

小明想当丑国的总统,丑国大选是按各州的投票结果来确定最终的结果的,如果得到超过一半的州的支持就可以当选,而每个州的投票结果又是由该州选民投票产生的,如果某个州超过一半的选民支持小明,则他将赢得该州的支持。现在给出每个州的选民人数,请问小明至少需要赢得多少选民的支持才能当选?

 

输入

输入包含多组测试数据。
每组数据的第一行是一个整数N(1<=N<=101),表示丑国的州数,当N=0时表示输入结束。
接下来一行包括N个正整数,分别表示每个州的选民数,每个州的选民数不超过100。

 

输出

对于每组数据输出一行,表示小明至少需要赢得支持的选民数。

 

样例输入

3

5  7  5

0

样例输出

6

 

代码块

import java.util.Arrays;
import java.util.Scanner;
import javax.naming.ldap.SortControl;
public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		while(scanner.hasNext()){
			int N=scanner.nextInt();
			if(N==0){
				System.exit(0);
			}
			int num=0;
			int[] arr=new int[N];
			for(int i=0;i<N;i++){
				arr[i]=scanner.nextInt();
			}
			Arrays.sort(arr);
			for(int j=0;j<(N/2+1);j++){
				num+=(arr[j]/2+1);
			}
			System.out.println(num);
		}

	}
}

解题思路:每个州中的支持选民人数需要大于这个州人数的一半,支持的州需要大于总州数的一半。

之前的错误代码:

import java.util.Arrays;
import java.util.Scanner;
import javax.naming.ldap.SortControl;
public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		while(scanner.hasNext()){
			int N=scanner.nextInt();
			int num=0;
			int sum=0;
			int ave=0;
			if(N==0){
				System.exit(0);
			}
			int a=0;
			if(N%2==0){
				a=N/2;
			}
			else {
				a=N/2+1;
			}
			int[] arr=new int[N];
			int[] arr1=new int[N];
			for(int i=0;i<N;i++){
				arr[i]=scanner.nextInt();
				sum=sum+arr[i];
				if(arr[i]%2==0){
					arr1[i]=arr[i]/2;
				}
				else {
					arr1[i]=arr[i]/2+1;
				}
			}
			ave=sum/N;
			Arrays.sort(arr1);
			for(int j=0;j<a;j++){
				num=num+arr1[j];
			}
			if(num<=ave){
				num=+1;
			}
			System.out.println(num);
		}
	}

}

错误原因:逻辑不清晰,先要满足在各州中的支持人数大于这个州的人数的一半,之后支持的州的数量要大于总州数的一半。在代码当中写了很多没必要的代码,不用创建两个数组,一个数组就行,也不用求平均值,不用考虑是奇数还是偶数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值