黑龙江大学程序设计竞赛(重现赛)

A:

Find the Nth Character

题目描述

今天在给

的同学们上程序算法课的时候出了一道找规律的题目,题目表述如下
假设:
现在要求上课的同学们把所有的串依次连接起来,于是得到:

那么你能告诉串中的第个字母是多少吗?




输入描述:

输入首先是一个数字,代表有次询问

接下来的行每行有一个整数

 

输出描述:

对于每次询问,输出串中第个位置对应的字母。

示例1

输入

复制
6
1
2
3
4
5
10

输出

复制
a
a
b
a
b
d
思路:这个题目似曾相识的感觉。。直接上代码吧
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include<sstream>
#include<cctype>
#include <queue>
#include <map>
#define ll long long
using namespace std;
char c[10010];
int main()
{
    ll t,q;
    cin>>t;
    for(ll i=1;i<=t;i++)
    {
        cin>>q;ll k=0;
        while(q-k*(k+1)/2>0)
        {
            k++;
        }
        --k;
        if(q-k*(k+1)/2==0) {if(k%26==0) k=26;else k%=26;cout<<char(96+k)<<endl;}
        else {
            q-=k*(k+1)/2;
            {if(q%26==0) q=26;else q%=26;cout<<char(96+q)<<endl;}
        }
    }
}

 下面代码是借鉴别人的:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    int n,T;
    while(~scanf("%d",&T))
    {
        while(T--)
        {
            scanf("%d",&n);
            int x=floor(0.5*(-1+sqrt(1+8*n))-0.001);
            // printf("x=%d\n",x);
            x=n-x*(x+1)/2;
            putchar('a'+(x-1)%26);
            puts("");
        }
    }
    return 0;
}

 C: 

  

爱的魔力转圈圈,想你想到心花怒放黑夜白天,可是我害怕爱情只是一瞬间,转眼会不见,我要慢慢冒险。经过了无数的思想斗争,他要做出这个决定,和喜欢的女孩子表白,但女孩只是留给他一个排列,排列的定义是一个由组成的序列每个数出现并且只出现1次。


现在他需要把个数通过一定顺序首尾连接形成一个圆环,使得相邻元素互质的对数尽可能多,请输出最大的对数。两个数互质的定义是这两个数的GCD(最大公约数)为1。比如6和4的最大公约数为2,不互质。4和3的最大公约数为1,互质。


输入描述:

第一行是一个数字,表示共有T组测试数据.

接下来行,每行一个数字.

输出描述:

一行一个整数表示答案
示例1

输入

复制
2
3
5

输出

复制
3
5
简单暴力。
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include<sstream>
#include<cctype>
#include <queue>
#include <map>
#define ll long long
using namespace std;
int c[10010];
bool gcd(int a,int b)
{
    if(a<b) swap(a,b);
    int r=a%b;
    while(r)
    {
        a=b;
        b=r;
        r=a%b;
    }
    if(b==1) return 1;
    else return 0;
}
int main()
{
    for(int i=1;i<=1000;++i)
        c[i]=i;
   ll t,q;
   cin>>t;
   while(t--)
   {
       cin>>q;int Max=-1000;
        sort(c+1,c+1001);
       do
       {
           int sum=0;
           if(gcd(c[1],c[q])) ++sum;
           for(ll i=1;i<q;++i)
           {
               if(gcd(c[i],c[i+1])) ++sum;
           }
           Max=max(sum,Max);
           if(sum==q) {break;}
       }while(next_permutation(c+1,c+t+1));
       cout<<Max<<endl;
   }
}
View Code

 K:

链接:https://ac.nowcoder.com/acm/contest/877/K
来源:牛客网

题目描述

输入描述:

输出描述:

示例1

输入

复制
2
35
1000000000

输出

复制
17
82

说明

In the first example, you can choose, for example,a = 17 andb = 18, so thatS(17) + S(18) = 1 + 7 + 1 + 8 = 17. It can be shown that it is impossible to get a larger answer.

In the second test example, you can choose, for example,a = 500000001 andb = 499999999, withS(500000001) + S(499999999) = 82. It can be shown that it is impossible to get a larger answer.

靠感觉贪心吧。是其中某个数尽可能每一位都是9,比如35,可以是9+(35-9)=35,如果是99就大于35了。
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include<sstream>
#include<cctype>
#include <queue>
#include <map>
#define ll long long
using namespace std;
int  ans[100100],sum[100100];
int main()
{
    ll t,n,m;
    cin>>t;
    while(t--)
    {
        cin>>n;
        ll s=0;
        while(n>s)
        {
            s=s*10+9;
        }
        s=(s-9)/10;
        ll sum=0;
        ll a=n-s;
        while(s)
        {
            sum+=s%10;
            s/=10;
        }
        while(a)
        {
            sum+=a%10;
            a/=10;
        }
        cout<<sum<<endl;
    }
}
View Code

 


剩下的有题解后再补



posted @ 2019-04-26 14:37  Auroras  阅读(350)  评论(0编辑  收藏  举报