链接:https://www.nowcoder.com/acm/contest/90/A
来源:牛客网
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
输入描述:
第一行输入一个整数t,代表有t组样例:( T<=30) 接下来的t行,都用一个整数n,表示楼梯有n级台阶( 1<=n<=30)
输出描述:
输出跳到第n级台阶有多少种跳法
输入
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++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
输入描述:
第一行一个整数T(T<=100),表示组数
对于每组数据有一个n,表示序列的长度(0< n <100000)
下面一行有n个数,表示每个序列的值(0<ai<1000)
输出描述:
输出两个数 第一个数表示最小的操作步数 第二个数经过若干步以后的数组元素是什么
输入
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++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
(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能互相抑制对方的负面效果,一旦生命值提升的倍数和能量值提升的倍数不相等,那么在五个小时后将会发生非常严重的后果。
作为埃森哲公司的一员,你觉得这个问题很简单,这得益于埃森哲公司分享知识的文化。
分享知识已成为埃森哲源远流长的文化。
埃森哲公司在帮助客户进行行之有效的知识管理的同时,它的管理层在其内部也进行了成功的知识管理的实践。如今,在埃森哲,分享知识已成为其源远流长的文化。在很大程度上,埃森哲公司的成功得益于其强大的知识管理系统。
输入描述:
第一行一个整数T,代表有T组数据。(1<=T<=5000) 每组数据仅一行,包含四个整数x,a,y,b,意义为题目描述。(1<=x,a,y,b<=10^9)
输出描述:
每组数据输出一行"Yes"或"No"(不包含双引号),表示TMK提升的生命值和能量值的倍数是否相等,相等为"Yes",不相等为"No"。
输入
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++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数)
输入描述:
在第一行输入一个正整数T。 接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。 (1<=n<=1e9)
输出描述:
输出符合该方程要求的解数。
输入
3 1 20180101 1000000000
输出
1 5 181
由1x+1y=1n
,可推得:x∗n+y∗n=x∗y ,进一步可推得:x∗y−x∗n−y∗n+n2=n2 ,即:(x−n)(y−n)=n2。
题目要计算满足x≤y
的解的个数。那么,从式子(x−n)(y−n)=n2可以看出,(x−n)(y−n)相乘为n2,即只要满足n2 %(x−n)=0,n2 %(y−n)=0就行。也就是,只要(x−n)和(y−n)为n2的因子且x≤y就行了。运用数论求因子个数的公式,最后解得个数就是原来的一般加上完全平方的解
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++ 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有点懵逼,所以
1.客户关系管理
2.业务解决方案
3.电子商务
4.供应链管理
输入描述:
第一行一个整数T(T<=10),表示组数
对于每组数据有一个n,表示有n个小星星(0< n < 1000)
接下来跟着n行,每行跟两个整数xi和yi表示每个星星的坐标(-10000< xi, yi<10000)
输出描述:
对于每组数据,如果没有找到回旋图标输出”WA”,否则输出找到图标个数
输入
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;
}
链接:https://www.nowcoder.com/acm/contest/90/D
来源:牛客网
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
然而面试官 xwc 一眼就看到了重点:大学打过 ACM!
xwc:“
听说你很低袄?考你个题:
忽略字母大小写,你这篇简历去掉最长的回文子序列后还有多长?
”
psd 顺手就把这个问题抛给了你。
输入描述:
多组输入,每组输入一个长度不超过 1234 的没空格的字符串,是 psd 的简历。
输出描述:
每组输出一个整数,如题。
输入
输出
2
输入
aBc,bAd
输出
2
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;
}