zoukankan      html  css  js  c++  java
  • 1005. 继续(3n+1)猜想 (25)

    题目

    https://www.patest.cn/contests/pat-b-practise/1005
    当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇到过了,我们称5、8、4、2是被3“覆盖”的数。我们称一个数列中的某个数n为“关键数”,如果n不能被数列中的其他数字所覆盖。

    现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

    输入格式:每个测试输入包含1个测试用例,第1行给出一个正整数K(<100),第2行给出K个互不相同的待验证的正整数n(1<n<=100)的值,数字间用空格隔开。

    输出格式:每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用1个空格隔开,但一行中最后一个数字后没有空格。

    输入样例:
    6
    3 5 6 7 8 11
    输出样例:
    7 6
    

    分析

    因为只有不到100个数,而且数的范围也很小(1~100),因此只要只要为每个数设置一个布尔类型的变量,被覆盖就标记一下就好。

    但是要注意,虽然最大的数不会超过100,但当n=99的时候,((3n)+1)/2=149,((3149)+1)/2=224因此数组要尽量开大些,因为只是bool类型,完全不用担心超过内存限制。

    AC代码

    #include "bits/stdc++.h"
    using namespace std;
    int main(int argc, char const *argv[])
    {
        int K;
        cin >> K;
        int a[K];
        bool ans[910];
        memset(ans, false, sizeof(ans)); //初始化未被覆盖
        for(int i = 0; i<K; i++){
            cin >> a[i];
            int t = a[i];
            while(t!=1){
                if(t&1){ //odd
                    t = ((3*t)+1)/2;
                }else{ // even
                    t /= 2;
                }
                if(ans[t]){ //已经被覆盖过
                    break;
                }else{
                    ans[t] = true;
                }
            }
        }
        std::vector<int> v;
        for(int i=0;i<K;i++){
            int t = a[i];
            if(!ans[t]) v.push_back(t);
        }
        sort(v.begin(), v.end(), greater<int>());
        cout << v[0];
        if(v.size() > 1){
            for(auto i = v.begin()+1; i != v.end(); i++)
                cout << ' ' << *i;
        }
    
        return 0;
    }
    
    
    转载请保留原文链接及作者
    本文标题:
    文章作者: LepeCoder
    发布时间:
    原始链接:
  • 相关阅读:
    Server-Side Access Control
    MDN > Web technology for developers > HTTP
    HTML5解决跨域问题
    HTML5安全:CORS(跨域资源共享)简介
    HTML5 知识点
    android中viewPager+fragment实现的屏幕左右切换(进阶篇)
    【Android】Android 博客园客户端 (七)登录功能
    【Tools】Pro Git 一二章读书笔记
    【JavaScript】重温Javascript继承机制
    【334】Python Object-Oriented Programming
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/pat-b-practise-1005.html
Copyright © 2011-2022 走看看