第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛

跳台阶

链接:https://www.nowcoder.com/acm/contest/90/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

小明在坐景驰科技研发的无人车到达了目的地。
景驰科技(JingChi.ai)是一家由人工智能技术驱动、以无人驾驶技术为核心的智能出行公司。它将打造面向中国市场的全无人驾驶。
从无人车下来以后,小明看到了一个长长的楼梯。
有一个n级台阶的楼梯,小明一次可以向上跳1步,两步,甚至是n步,请问小明跳到n级台阶有多少种跳法?

输入描述:

第一行输入一个整数t,代表有t组样例:( T<=30)
接下来的t行,都用一个整数n,表示楼梯有n级台阶( 1<=n<=30)

输出描述:

输出跳到第n级台阶有多少种跳法
示例1

输入

1
1

输出

1

解题思路:这是一道规律题:每一步从1~n中选择i步跳上台阶,使得刚好跳到第n层。其实就是求1~n中选择几个数(可以重复)与顺序有关相加等于n即可。
再讲得通俗些就是现在n为3,你可以先跳1步,再跳2步到第3层,也可以先跳2步,再跳1步到第3层;可以跳3步直接到第3层,也可以分3次跳1步到第3层,按照这样的规律来找即可找出答案。
下面举4个栗子:(等号左边的数进行排列得到组合个数)
当n=1时,只有一种排列组合:1=1
当n=2时,有如下排列组合:
1+1=2--->1种
2=2  --->1种
一共2种。
当n=3时,有如下排列组合:
1+1+1=3--->1种
1+2=3  --->2种
3=3    --->1种
一共4种。
当n=4时,有如下排列组合:
1+1+1+1=4--->1种
1+1+2=4  --->3种
2+2=4    --->1种
1+3=4    --->2种
4=4      --->1种
一共8种。
由前几项 1 2 3 4 5 ... n
        1 2 4 8 16... 2^(n-1)
可知规律就是a[i]=2*a[i-1]

code:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n;
int a[35] = {0};
int cnt;
int main(){
    int t;
    a[1] = 1;
    for(int  i = 2; i < 35; i++){
        a[i] = a[i-1] * 2;
    }
    cin >> t;
    while(t--){
        cin >> n;
        cout << a[n] << endl;
    }
    return 0;
}

强迫症的序列

链接:https://www.nowcoder.com/acm/contest/90/J
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

牛客网是IT求职神器,提供海量C++、JAVA、前端等职业笔试题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的编程。作为acmer的小A,牛客网是他首选的题库。
小A是一个中度强迫症患者,每次做数组有关的题目都异常难受,他十分希望数组的每一个元素都一样大,这样子看起来才是最棒的,所以他决定通过一些操作把这个变成一个看起来不难受的数组,但他又想不要和之前的那个数组偏差那么大,所以他每次操作只给这个数组的其中n-1个元素加1,但是小A并不能很好的算出最优的解决方案,如果你能帮他解决这个问题,小A就能送你一个气球

输入描述:

 
 

第一行一个整数T(T<=100),表示组数

对于每组数据有一个n,表示序列的长度(0< n <100000)

下面一行有n个数,表示每个序列的值(0<ai<1000)

输出描述:

输出两个数
第一个数表示最小的操作步数
第二个数经过若干步以后的数组元素是什么
示例1

输入

1
3
1 2 3

输出

3 4

分析:

每一次操作都是将 n-1 个数加上一个 1,那也就是等价于,每次操作都可以在 n 个数中挑出一个减去 1,于是我们就可以知道当经过 m 次操作之后,将 n-1个数都变成与最小的那个数相等的时候,那序列中元素按照题中的要求所得到的序列的所有元素就是该序列中最小的元素加上经过操作的次数,要将 n-1个元素全部变成与最小的那个相等,只需要将序列进行排序,然后让 n-1个元素都减去最小的元素的加和即可。


code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
    int n,t,a[100005];
    long long ans1,ans2;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        ans1 = 0;
        for(int i = 0; i < n; i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        for(int i = 1; i < n; i++){
            ans1 += a[i] - a[0];
        }
        ans2 = a[0] + ans1;
        cout << ans1 << " "  << ans2 << endl;
    }
    return 0;
}

用来作弊的药水

链接:https://www.nowcoder.com/acm/contest/90/L
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

    在一个风雨交加的夜晚,来自异世界的不愿透露姓名的TMK同学获得了两种超强药水A、B。根据说明书,TMK知道了这两种药水的作用:
    (1)药水A能使人的生命值提高,每饮用1个单位能使他生命值变成原来的x倍,即每饮用p个单位能使他的生命值变成原来的x^p(x的p次方)倍。
    (2)药水B能使人的能量值提高,每饮用1个单位能使他能量值变成原来的y倍,即每饮用q个单位能使他的能量值变成原来的y^q(y的q次方)倍。
    于是TMK迫不及待地喝下了所有的a个单位的药水A和b个单位的药水B,他立马体会到了自己能力的超强变化,然后他看了接下来的说明书:
    药水A和药水B能互相抑制对方的负面效果,一旦生命值提升的倍数和能量值提升的倍数不相等,那么在五个小时后将会发生非常严重的后果。
    于是TMK同学慌了,他想知道自己提升的生命值和能量值的倍数是否相等,由于他非常慌张,所以他把计算的重任交给你了。

作为埃森哲公司的一员,你觉得这个问题很简单,这得益于埃森哲公司分享知识的文化。

   分享知识已成为埃森哲源远流长的文化。
   埃森哲公司在帮助客户进行行之有效的知识管理的同时,它的管理层在其内部也进行了成功的知识管理的实践。如今,在埃森哲,分享知识已成为其源远流长的文化。在很大程度上,埃森哲公司的成功得益于其强大的知识管理系统。



输入描述:

第一行一个整数T,代表有T组数据。(1<=T<=5000)
每组数据仅一行,包含四个整数x,a,y,b,意义为题目描述。(1<=x,a,y,b<=10^9)

输出描述:

每组数据输出一行"Yes"或"No"(不包含双引号),表示TMK提升的生命值和能量值的倍数是否相等,相等为"Yes",不相等为"No"。
示例1

输入

4
2 20 4 10
20 20 20 20
20 21 21 20
32768 32768 1048576 24576

输出

Yes
Yes
No
Yes

code:

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main(){
    int t;
    cin >> t;
    while(t--){
        int x,a,y,b;
        cin >> x >> a >> y >> b;
        double i,j;
        i = a*log(x);
        j = b*log(y);
        if(fabs(i-j) <= 0.1)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}

等式

链接:https://www.nowcoder.com/acm/contest/90/F
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数)


输入描述:

在第一行输入一个正整数T。
接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。
(1<=n<=1e9)

输出描述:

输出符合该方程要求的解数。
示例1

输入

3
1
20180101
1000000000

输出

1
5
181
思路

  由1x+1y=1n

,可推得:xn+yn=xy ,进一步可推得:xyxnyn+n2=n2 ,即:(xn)(yn)=n2

  题目要计算满足xy

的解的个数。那么,从式子(xn)(yn)=n2可以看出,(xn)(yn)相乘为n2,即只要满足n2 %(xn)=0,n2 %(yn)=0就行。也就是,只要(xn)(yn)n2的因子且xy就行了。运用数论求因子个数的公式,最后解得个数就是原来的一般加上完全平方的解

code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
    int t,n;
    cin >> t;
    while(t--){
        cin >> n;
        int a[10000];
        memset(a,0,sizeof(a));
        int i,j = 0;
        for(i = 2; i * i <= n; i++){
            if(n % i == 0){
                while(n % i == 0){
                    n /= i;
                    a[j]++;
                }
                j++;
            }
        }
        if(n != 1){
            a[j++] = 1;
        }
        int sum = 1;
        for(int i = 0; i < j; i++){
            sum *= (2 * a[i] + 1);
        }
        sum = (sum + 1) / 2;
        cout << sum << endl;
    }
    return 0;
}

回旋星空

链接:https://www.nowcoder.com/acm/contest/90/E
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

曾经有两个来自吉尔尼斯的人(A和C)恋爱了,他们晚上经常在一起看头上的那片名为假的回旋星空,

有一天他们分手了,A想通过回旋星空测量他们之间的复合指数,测量的规则是,

计算回旋图标的个数,即选中三颗星星,分别作为回旋图标的起点,拐点和终点,假设现在有三个

星星分别为i,j,k,如果d(a[i],a[j]) == d(a[j],a[k])则表示找到了一个回旋图标,其中d(x,y)表示这两个点的欧氏距离

为了给它很大的希望(i,j,k)和(k,j,i)被认为是两个不同的回旋图标

 

A花了一晚上终于把整片星空映射到了一张二平面图上,由于星星太多以至于A有点懵逼,所以

你能帮帮他吗,要不然他可能真的WA的一声哭了出来
作为埃森哲公司的一员,你在解决问题的同时也向A介绍了埃森哲公司的业务范围。
为了全方位地满足客户的需求,正在不断拓展自身的业务服务网络,包括管理及信息技术咨询、企业经营外包、企业联盟和风险投资。除了以产品制造业、通信和高科技、金融服务、资源、政府机构等不同行业划分服务内容之外,还从以下几方面提供咨询服务:
1.客户关系管理
2.业务解决方案
3.电子商务
4.供应链管理

输入描述:

 
 

第一行一个整数T(T<=10),表示组数

对于每组数据有一个n,表示有n个小星星(0< n < 1000)

接下来跟着n行,每行跟两个整数xi和yi表示每个星星的坐标(-10000< xi, yi<10000)

输出描述:

对于每组数据,如果没有找到回旋图标输出”WA”,否则输出找到图标个数
示例1

输入

2
2
1 0
0 1
3
1 0
0 1
0 0

输出

WA
2

备注:

没有重复的星星,且选中的三个星星是互相不一样的(即下标不同)
欧氏距离即直线距离

以每个点为中心,向两边延伸符合条件的点

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct node{
    int x,y;
}a[1010];
int b[1010];
int main(){
    int q;
    scanf("%d",&q);
    while(q--){
        int n;
        scanf("%d",&n);
        memset(a,0,sizeof(a));
        for(int i = 0; i < n; i++){
            scanf("%d%d",&a[i].x,&a[i].y);
        }
        int s = 0;
        for(int i = 0; i < n; i++){
            int x = a[i].x;
            int y = a[i].y;
            memset(b,0,sizeof(b));
            for(int j = 0; j < n; j++){
                b[j] = abs(x-a[j].x)*abs(x-a[j].x)+abs(y-a[j].y)*abs(y-a[j].y);
            }
            sort(b,b+n);
            int u = 1;
            for(int j = 2; j < n; j++){
                if(b[j] == b[u])
                    s++;
                else{
                    u++;
                    j = u;
                }
            }
        }
        if(s == 0) printf("WA\n");
        else printf("%d\n",2*s);
    }
    return 0;
}

psd面试

链接:https://www.nowcoder.com/acm/contest/90/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

掌握未来命运的女神 psd 师兄在拿了朝田诗乃的 buff 后决定去实习。
埃森哲公司注册成立于爱尔兰,是一家全球领先的专业服务公司,为客户提供战略、咨询、数字、技术和运营服务及解决方案。他们立足商业与技术的前沿,业务涵盖40多个行业,以及企业日常运营部门的各个职能。凭借独特的业内经验与专业技能,以及翘楚全球的交付网络, 他 们帮助客户提升绩效,并为利益相关方持续创造价值。埃森哲是《财富》全球500强企业之一,目前拥有约41.1万名员工,服务于120多个国家的客户。 于是psd打算去 埃森哲公司投一下简历 。
于是他用英文写了一篇简历,由于手速太快了以致自己都不知道写了什么。
然而面试官 xwc 一眼就看到了重点:大学打过 ACM!
xwc:“
    听说你很低袄?考你个题:
    忽略字母大小写,你这篇简历去掉最长的回文子序列后还有多长?

psd 顺手就把这个问题抛给了你。

输入描述:

多组输入,每组输入一个长度不超过 1234 的没空格的字符串,是 psd 的简历。

输出描述:

每组输出一个整数,如题。
示例1

输入

google

输出

2
示例2

输入

aBc,bAd

输出

2
题意:给一个字符串,求去掉最长回文子序列得到的串的长度。
思路: 题目所说的 是最长回文子序列,也就是改回文串是可以不连续的。
将所给的字符串反转,变成求两个字符串的LCS(最长公共子序列)问题。
dp[i][j] = dp[i-1][j-1]+1,两字符相等时
dp[i][j] = max(dp[i-1][j],dp[i][j-1]),不等时  (1<=i,j<=sz)

code:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1235;
    int dp[maxn][maxn];
    int main()
    {
        string s;
        while(cin>>s)
        {
            int len=s.size();
            for(int i=0;i<len;i++)
            {
                if(s[i]>='A'&&s[i]<='Z')
                    s[i]+=32;
            }
            string t=s;
            dp[0][0]=0;
            reverse(t.begin(),t.end());
            for(int i=1;i<=len;i++)
            {
                for(int j=1;j<=len;j++)
                {
                    if(s[i-1]==t[j-1])
                        dp[i][j]=dp[i-1][j-1]+1;
                    else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
                }
            }
            printf("%d\n",len-dp[len][len]);
        }
        return 0;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值