zoukankan      html  css  js  c++  java
  • QFNU-ACM 2020.10.30 Trating

    D.

    题意:给定一个字符串,0表示一个航天公司、1表示另外一个航天公司、同一个航天公司的飞机免费,问从a到b最少花费的价钱是多少。

    题解:这是一个cf的a题,主要是思维,因为不论怎样从0的旁边都有1,1的旁边都有0,所以最少价钱是0,最多价钱就是1,还是cf打的太少了。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int n,a,b;
        string p;
        cin>>n>>a>>b;
        cin>>p;
        if(p[a-1]==p[b-1]){
            cout<<0<<endl;
        }
        else{
            cout<<1<<endl;
        }
    }

    E.

    题意:给定一个执行n-1次的序列,执行一次就多加一个数然后把序列加到前面,问第k的数是多少。

    题解:根据题目给定的范围是一个找规律的题目,

    初态: 1 此时 n=1

    第 1 次: 1 2 1 此时 n=2

    第 2 次: 1 2 1 3 1 2 1 此时 n=3

    第 3 次: 1 2 1 3 1 2 1 4 1 2 1 3 1 2 此时 n=4

    …………

    以上可以看出:

    序列的奇数位置均为 1;

    序列的偶数位置,可以观察:出现同一个数字的位置成等差数列

    第一次出现 2 的位置是 2 ^ ( 2-1 ) ,公差为 2 ^ 2 ;

    第一次出现 3 的位置是 2 ^ ( 3-1 ) ,公差为 2 ^ 3 ;

    第一次出现 4 的位置是 2 ^ ( 4-1 ) ,公差为 2 ^ 4 ;

    …………

    第一次出现 m 的位置是 2 ^ ( m-1 ) ,公差为 2 ^ m ;通项公式为 ( 2t - 1 ) * 2 ^ ( m -1 ) ,表示第 t 次出现 m 的位置是 ( 2t - 1 ) * 2 ^ ( m -1 ) ;这里的 t = ( 1,2,3 …… ) ,显然 t 为奇数。

    处理 n-1 次出现的整数有 n 个,然后枚举这 n 个整数,判断是否合法。

    代码:

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<map>
    #define LL long long
    using namespace std;
    int n;
    LL k;
    int main()
    {
        while(~scanf("%d%I64d",&n,&k))
        {
            if(k&1)
                puts("1");
            else
            {
                for(int i=1;i<=n;i++)
                {
                    LL p=1LL<<i-1;
                    if(k%p==0&&((k/p)&1))
                    {
                        printf("%d
    ",i);
                        break;    
                    }    
                }
            }    
        }
        return 0;
    } 

    F.

    题意:给一个公式然后给你一个n,问能否求得x、y、z。

    题解:一个数学题,给了2/n就已经暗示了要把2/n拆成2个1/n,然后使得得x=1/n那么可以消得1/n=1/y+1/z了,根据数学公式1/(n+1)+1/n(n+1)等于1/n,所以y=(n+1),z=n(n+1),再特判下当n=1时不存在即可。

    代码:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    int main(){
        ll n;
        cin>>n;
        ll a,b,c;
        a=n;
        b=n+1;
        c=n*(n+1);
        if(n==1){
            cout<<-1<<endl;
            return 0;
        }
        cout<<a<<" "<<b<<" "<<c<<endl;
    }

     7-6 连续因子 (20分)

    题意:找出最长的连续因子,并输出最小的那个。

    题解:遍历从2-根号n,然后只要能被模就进行判断,最大的因子是几个,一直循环判断,然后最后输出最大的就行。

    代码:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    int main(){
        ll n,sum=0,k;
        cin>>n;
        for(ll i=2;i*i<=n;i++){
            if(n%i!=0){
                continue;
            }
            ll j=i;
            ll t=n;
            ll num=0;
            while(t%j==0){
                t/=j;
                j++;
                num++;
            }
            if(sum<num){
                sum=num;
                k=i;
            }
        }
        if(sum==0){
            cout<<1<<endl;
            cout<<n<<endl;
        }
        else{
            cout<<sum<<endl;
            for(int i=0;i<sum;i++){
                if(i!=sum-1){
                    cout<<k+i<<"*";
                }
                else{
                    cout<<k+i<<endl;
                }
            }
        }
    } 

    7-5 古风排版 (20分)

    题意:就是像古人一样从右到左从上到下输出。

    题解:比赛的时候就是这题卡着心态崩了,想到了好多方法就是一直错了,其实就是用一个一维数组,找出n然后输从后往前输出然后--n输出。

    代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    
    int main()
    {
        int n;
        cin>>n;
        getchar(); 
        
        char a[1155];
        cin.get(a,1155); //输入带有空格的字符串
      
        int num=strlen(a); //cout<<num;
        int num1;
        int sub=(num/n);  //num是长度,n是每列n个字符 
        if(num%n!=0)
        {
            sub++;
            num1=sub*n;   //sub是 
         
         
             for(int i=num;i<num1;i++)
        {
            a[i]=' ';
        }
        sub--;
        for(int j=n;j>0;j--)
        {
        for(int i=num1-j;i>=0;i=i-n)
        {
            cout<<a[i];
        }
        cout<<endl;
        }
        }
        else
        {
                for(int j=n;j>0;j--)
            {
            for(int i=num-j;i>=0;i=i-n)
            {
            cout<<a[i];
            }
            cout<<endl;
            }
        }
    }
  • 相关阅读:
    Java中如何判断一个字符串是否为数字
    Web发展简史
    常用编程语言
    浏览器运行原理
    [LeetCode]69. x 的平方根(数学,二分)
    [计算机网络]TCP/IP协议-运输层
    [剑指Offer]33-根据后序序列判断是否能组成BST
    [剑指Offer]17-打印从1到最大的n位数(递归)
    [剑指Offer]56-数组中数字出现的次数(位运算)
    [剑指Offer]18-题目一:删除链表的节点 题目二:删除链表中重复节点
  • 原文地址:https://www.cnblogs.com/liyongqi/p/13940944.html
Copyright © 2011-2022 走看看