鱼C论坛

 找回密码
 立即注册
查看: 949|回复: 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)。
想看看其他大佬代码,学习学习
#include <stdio.h>

int main()
{
    int n, count = 0, num, res;
    scanf("%d", &n);
    /*----- 摩尔投票法 -----*/
    while(n--){
        scanf("%d", &num);
        if(!count) res = num;
        res == num ? count++ : count--;
    }
    count ? printf("%d", res) : printf("%d", -1);
    return 0;
}
20200111081914_75106.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-9 14:48:44 | 显示全部楼层
不知道是不是你需要的
#include<stdio.h>
int main(){
        int i,j,n,max,a[256],b[10]={0};
        scanf("%d",&n);
        for(i=0;i<n;i++)scanf("%d",&a[i]);
        for(i=0;i<n;i++)b[a[i]]++;
        max=b[0];
        for(i=0;i<10;i++){
                
                if(b[i]&&b[i]>max){
                        max=b[i];
                        j=i;
                }
        }
        if(max>n/2)printf("%d\n",j);
        else printf("-1");
        return 0; 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

它们的值位于区间[0,1000000000]。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这。。。
计算量有点大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

所以想求比较好的算法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

                }
                if ((i&&a[i-1]!=a[i]))
                {
                        if (i-bigin>count/2)
                        {
                                flag=a[i-1];
                                break;
                        }
                        bigin=i;
                }
        }
        if (i==count)
        {
                if(i-bigin>count/2)
                {
                        flag=a[i-1];

                }

        }
        printf("%d",flag);
        free(a);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int main()
{
    int n, count = 0, num, res;
    scanf("%d", &n);
    /*----- 摩尔投票法 -----*/
    while(n--){
        scanf("%d", &num);
        if(!count) res = num;
        res == num ? count++ : count--;
    }
    count ? printf("%d", res) : printf("%d", -1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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 ^.^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-10 16:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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