鱼C论坛

 找回密码
 立即注册
查看: 1295|回复: 7

[已解决]求比较好的算法

[复制链接]
发表于 2022-2-9 13:53:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
输入由多组数据组成。
每组数据由二行组成,第一行是整数n(1<=n<=100000), 第二行是n个空格分开的整数,它们的值位于区间[0,1000000000]。
题目保证60%的数据n的值不超过20。
输出
每一组输入数据输出一行。如果存在满足条件的x,则输出,否则输出-1。
样例输入 Copy
3
3 2 3
8
0 5 5 3 5 7 5 5
8
0 5 5 3 5 1 5 7
最佳答案
2022-2-9 18:12:32
我的代码只用到一个 while 循环,时间复杂度是:O(n)。
想看看其他大佬代码,学习学习
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int n, count = 0, num, res;
  5.     scanf("%d", &n);
  6.     /*----- 摩尔投票法 -----*/
  7.     while(n--){
  8.         scanf("%d", &num);
  9.         if(!count) res = num;
  10.         res == num ? count++ : count--;
  11.     }
  12.     count ? printf("%d", res) : printf("%d", -1);
  13.     return 0;
  14. }
复制代码
20200111081914_75106.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-2-9 14:48:44 | 显示全部楼层
不知道是不是你需要的
  1. #include<stdio.h>
  2. int main(){
  3.         int i,j,n,max,a[256],b[10]={0};
  4.         scanf("%d",&n);
  5.         for(i=0;i<n;i++)scanf("%d",&a[i]);
  6.         for(i=0;i<n;i++)b[a[i]]++;
  7.         max=b[0];
  8.         for(i=0;i<10;i++){
  9.                
  10.                 if(b[i]&&b[i]>max){
  11.                         max=b[i];
  12.                         j=i;
  13.                 }
  14.         }
  15.         if(max>n/2)printf("%d\n",j);
  16.         else printf("-1");
  17.         return 0;
  18. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-9 14:58:49 | 显示全部楼层
basketmn 发表于 2022-2-9 14:48
不知道是不是你需要的

它们的值位于区间[0,1000000000]。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-9 15:12:16 | 显示全部楼层
jhq999 发表于 2022-2-9 14:58
它们的值位于区间[0,1000000000]。

这。。。
计算量有点大
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-9 15:53:23 | 显示全部楼层
basketmn 发表于 2022-2-9 15:12
这。。。
计算量有点大

所以想求比较好的算法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-9 17:10:06 | 显示全部楼层
  1. int main()
  2. {
  3.         int count=0,i=0,j=0;
  4.         scanf("%d",&count);
  5.         int *a=(int*)malloc(sizeof(int)*count);
  6.         for(i=0;i<count;i++)scanf("%d",&a[i]);
  7.         int flag=-1,tmp=0,bigin=0;
  8.         for(i=0;i<count;i++)
  9.         {

  10.                 for(j=i+1;j<count;j++)
  11.                 {
  12.                         if(a[i]>a[j])tmp=a[i],a[i]=a[j],a[j]=tmp;

  13.                 }
  14.                 if ((i&&a[i-1]!=a[i]))
  15.                 {
  16.                         if (i-bigin>count/2)
  17.                         {
  18.                                 flag=a[i-1];
  19.                                 break;
  20.                         }
  21.                         bigin=i;
  22.                 }
  23.         }
  24.         if (i==count)
  25.         {
  26.                 if(i-bigin>count/2)
  27.                 {
  28.                         flag=a[i-1];

  29.                 }

  30.         }
  31.         printf("%d",flag);
  32.         free(a);
  33.         return 0;
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-9 18:12:32 | 显示全部楼层    本楼为最佳答案   
我的代码只用到一个 while 循环,时间复杂度是:O(n)。
想看看其他大佬代码,学习学习
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int n, count = 0, num, res;
  5.     scanf("%d", &n);
  6.     /*----- 摩尔投票法 -----*/
  7.     while(n--){
  8.         scanf("%d", &num);
  9.         if(!count) res = num;
  10.         res == num ? count++ : count--;
  11.     }
  12.     count ? printf("%d", res) : printf("%d", -1);
  13.     return 0;
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-9 18:53:09 | 显示全部楼层
傻眼貓咪 发表于 2022-2-9 18:12
我的代码只用到一个 while 循环,时间复杂度是:O(n)。
想看看其他大佬代码,学习学习

玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。最后能剩下的必定是自己人。

你这个应该是最简单的了吧?
0 5 5 3 5 7 5 5
5 res=5 1
5 2
7 1
5 2
3 1
5 2
5 3
0 2

0 5 5 3 5 1 5 7

7 res=7 1
5 0
1 res=1 1
5 0
3 res=3 1
5 0
5res=5 1
0 0

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
傻眼貓咪 + 1 + 1 ^.^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 21:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表