zoukankan      html  css  js  c++  java
  • 英雄卡(输入计数)【标记思想】

                                                          5779: 英雄卡(点击)

                                                                         时间限制: 1 Sec  内存限制: 128 MB
                                                                                     提交: 821  解决: 143
                                                                         [提交] [状态] [讨论版] [命题人:admin]

    题目描述

    小李非常迷恋收集各种干脆面里面的英雄卡,为此他曾经连续一个月都只吃干脆面这一种零食,但是有些稀有英雄卡真的是太难收集到了。后来某商场搞了一次英雄卡兑换活动,只要你有三张编号连续的英雄卡,你就可以换任意编号的英雄卡。小李想知道他最多可以换到几张英雄卡(新换来的英雄卡不可以再次兑换)。

    输入

    第一行,共一个整数n(1<=n<=10000),表示小李拥有的英雄卡数。
    第二行,共n个空格隔开的数字ai(1<=ai<=100000),表示英雄卡的编号。

    输出

    输出仅有一行,共1个整数,表示小李最多可以换到的英雄卡。

    样例输入

    复制样例数据

    6
    3 1 2 4 4 5
    

    样例输出

    1


    提示

    1 2 3三张编号连续,可以换一张,换完后剩下4 4 5,不符合兑换规则,无法继续兑换。

    思路:

          这个题有点坑 本来题目中说是 (1<=n<=10000) ,所以我把数组开到稍微大一点 提示 运行错误 问过学长后 开大了范围 但时间超限 没有办法 只能换思路 。

         通过输入计数解决 重复 匹配 问题。

          在输入数据的时候就用一维数组 记录输入的(每个)值的数目(肯定 如果数字重复的话 会在原来数目基础上增加)。

          将数组排序(输入数据的数组) 然后用一层for循环+while循环   for循环跑  输入的数组 用while 判断并且查找能够构成几组3个连续的数  直到跳出循环 再取找下一个。(具体看代码)

    正确代码:

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int a[100005],count2[100005]={0};      //数据有误 要将数组开大,不然会运行错误
    int main()
    {
        int n,i,j,count1; 
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d",&a[i]);
            count2[a[i]]++;                //记录输入的每个数字的数目(重复的数字会在原来基础++)
        }
        sort(a,a+n);
        count1=0;
        for(i=0;i<n;i++){              
            while(count2[a[i]]>0&&count2[a[i]+1]>0&&count2[a[i]+2]>0){
             
                count1++;                       //满足count[a[i]]和count[a[i]+1]、a[[i]+2]的
                count2[a[i]]--;                   数量 直到跳出循环
                count2[a[i]+1]--;
                count2[a[i]+2]--;          //符合条件的一组中每个数的数目-1
            }
        }
        printf("%d
    ",count1);
        return 0;
    }
    

    运行错误+时间超限:

    *思路:(虽然不错 但由于使用2层for循环会超时)

    先排序 然后从第一个数据开始完后判断  满足a[i]+1=a[i+1]的话count++,直到count==2,将之前用过的i i+1 i+2标记以下

    避免之后循环中再次使用

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    int a[100006],flag[100006],c[5];
    int main()
    {
        int n,i,count,k,j;
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        count=0;
        for(i=0;i<n-1;i++){
            if(flag[i]==0){
                k=1;
                for(j=i+1;j<n;j++){
                    if(a[i]+k==a[j]&&flag[j]==0){
                        c[k++]=j;
                    }
                    if(k==3){
                        flag[i]=1;
                        flag[c[1]]=1;
                        flag[c[2]]=1;
                        count++;
                        break;
                    }
                }
            }
        }
        printf("%d
    ",count);
        return 0;
    }
  • 相关阅读:
    算法学习:二分法从入门到精通
    TypeScript筑基笔记一:Visual Studio Code 创建Typescript文件和实时监控
    LeetCode 92. 反转链表 II
    LeetCode 1525. 字符串的好分割数目
    字节跳动-people后台一面面经
    LeetCode 117. 填充每个节点的下一个右侧节点指针 II
    LeetCode 1529. 灯泡开关 IV
    LeetCode 165. 比较版本号
    LeetCode 312. 戳气球
    LeetCode 605. 种花问题
  • 原文地址:https://www.cnblogs.com/ldu-xingjiahui/p/12407481.html
Copyright © 2011-2022 走看看