A - Multiple of 9
B - Distance
C - Step
A、B、C三个题是上次比赛的原题,如果还不会的请好好反思一下。如果想看题解,请跳转上次的博客。
上次博客的连接:https://blog.nowcoder.net/n/072d8e524221494bb20ca24a78614fb1
D - Walk on Multiplication Table
题意:给你一个整数N,让你从(1,1)点出发,到达(x,y)点,并且(x,y)满足x*y=N,问你(x-1)+(y-1)最小是多少?
思路:找N的因子,因为N的大小是2~1e12,所以用sqrt(N)找N的因子完全可以,我们易知,离sqrt(N)越近的两个因子相加的和越小,所以我们只需要找到离sqrt(N)最近的两个N的因子就可以了。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { ll n; cin >> n; ll sum=0; for (int i=1;i<=sqrt(n);i++) { if(n%i==0) sum=(i-1)+((n/i)-1); //如果i是n的因子,那么sum就更新值,因为i的值越来越接近sqrt(n),所以直接更新值就是最后的答案。 } cout << sum << endl; }
E - 9x9
题意/思路:给你两个数,如果有其中一个大于9,那么就输出-1,否则就输出两者的乘积。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { int x,y; cin >> x >> y; if(x>9||y>9) cout << "-1" << endl; else cout << x*y << endl; }
F - Round One
题意/思路:给你两个数,如果这两个数是1,2,则输出3,如果这两个数是1,3,则输出2,如果这两个数是2,3,则输出1.
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { int x,y; cin >> x >> y; if((x==1&&y==2) || (x==2&&y==1)) cout << 3 << endl; else if((x==1&&y==3) || (x==3&&y==1) ) cout << 2 << endl; else if((x==2&&y==3) || (x==3&&y==2) ) cout << 1 << endl; }
G - Strings with the Same Length
题意:给你两个字符串,且两个字符串的长度已知且相等,让你各自输出每个字符串的字符。
思路:可以用char数组做,也可以用string做,并且长度告诉你了,当然如果长度并没有告诉你,那么也可以求,如果现在还有人不会求char数组和string的长度,那么抓紧百度或者问师哥/师姐。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { int n; cin >> n; string s1,s2; cin >> s1 >> s2; for (int i=0;i<n;i++) //先输出s1的字符,再输出s2的字符 { cout << s1[i] << s2[i]; } cout << endl; }
H - Snack
题意:求两个数的最小公倍数
思路:最小公倍数的求法:两个数的乘积/两个数的最大公因数,最大公因数的求法最好用辗转相除法。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; ll gcd(ll a, ll b) //辗转相除法求最大公因数 { if(a%b == 0) return b; //如果可以整除的话,直接返回b(即b就是a和b的最大公因数) return gcd(b, a%b); //如果不可以整除的话,用递归的方式表示辗转相除法,使a=b,b=a%b. } int main() { ll x,y; cin >> x >> y; cout << x*y/gcd(x,y); cout << endl; }
I - 81
题意:给你一个数N,问你可不可以用1到9以内的任意两个数(可以重复),使得两者的乘积等于N。
思路:用两个for循环,每个for循环都是从1-9。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { int n; cin >> n; int flag=0; //用flag标记 for (int i=1;i<=9;i++) { for (int j=1;j<=9;j++) { if(i*j==n) flag=1; //如果可以,则将flag设为1 } } if(flag==1) cout << "Yes" << endl; else cout << "No" << endl; }
J - Curtain
题意/思路:给你两个数A和B,A代表总长度,问你两个B能否>=A,如果可以输出0,如果不可以输出两者的差值
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { int x,y; cin >> x >> y; if(x-y*2<=0) cout << 0 << endl; else cout << x-y*2 << endl; }
K - TAKOYAKI FESTIVAL 2019
题意/思路:给你N个数,让你每次从中选出两个不同的数,求所有可能的两个数乘积之和。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int a[100000]; int main() { int n; cin >> n; for (int i=1;i<=n;i++) { cin >> a[i]; } int sum=0; for (int i=1;i<n;i++) { for (int j=i+1;j<=n;j++) { sum+=a[i]*a[j]; } } cout << sum << endl; }
L - Slimes
题意/思路:
给你一个字符串,且已知字符串的长度,让你求一共有多少种不同种类(这里说的不严谨,但绝不是字符的种类),以第一个例子给大家解释一下:
10
aabbbbaaca
这个字符串的长度是10,由字符串可知,aa,bbbb,aa,c,a分别是不同类(我是这样定义的,不理解的请自行看原题目)
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int a[100000]; int main() { int n; cin >> n; string s; cin >> s; int sum=1; for (int i=1;i<n;i++) { if(s[i]!=s[i-1]) sum++; } cout << sum << endl; }
M - Odds of Oddness
题意/思路:
给你一个整数N,让你求出1~N之间奇数的概率。这道题N的最大值是100,所以完全可以直接暴力做。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { int n; cin >> n; int sum=0; for (int i=1;i<=n;i++) { if(i%2==1) sum++; } double ans=sum*1.0/n ; printf("%.10lf\n",ans); }
N - Roller Coaster
题意/思路:
给你N个数,和一个标准K,问你有多少个数是大于等于这个标准K的。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { int x,y; cin >> x >> y; int z; int sum=0; for (int i=1;i<=x;i++) { cin >> z; if(z>=y) sum++; } cout << sum << endl; }
O - Go to School
题意:
跟你一个整数N代表有多少个学生,在给你N个数,第i个数表示第i个学生进教室之前加上自己已经有多少学生进教室了。问你将所有同学进教室的顺序写出来。
思路:如果我进教室加上我自己教室一共有一个学生,那么我就是第1个进教室的,如果我进教室加上我自己教室一共有两个学生,那么我就第2个进教室的,以此类推,给我的数是几,我就是第一个进教室的。用一个结构体排序就可以了,最近不是练过结构体排序了嘛,关于结构体排序我就不详细讲解。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; struct sss { int i; int j; }a[100005]; bool cmp(sss x,sss y) { return x.i<y.i; } int main() { int n; cin >> n; for (int i=1;i<=n;i++) { cin >> a[i].i; a[i].j=i; } sort(a+1, a+1+n, cmp); for (int i=1;i<n;i++) { cout << a[i].j << " "; } cout << a[n].j << endl; }
P - Password
题意:给你一个数n,现在有三位数,每一位数可以取1~n的任何数。
思路:求解n的三次方
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { int n; cin >> n; cout << n*n*n << endl; }
Q - Buffet
题意/思路:
给你一个整数N,然后有N个美食,第二行输入吃这N个美食的顺序,第三行的第i个数代表吃第i个美食所能获得的能量,如果上一个吃的美食(x)跟这一次吃的美食(y)满足x+1=y,那么就可以获得第x美食的额外的能量。
就是在这个题我W了2次,别的都是一发入魂,一开始读错题了,以为是只要现在吃的美食的上一个美食吃过就可以获得额外的能量,哎,英语水平还是太菜了呀。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int a[100005]; int b[100005]; int c[100005]; int main() { int n; cin >> n; for (int i=1;i<=n;i++) cin >> a[i]; for (int i=1;i<=n;i++) cin >> b[i]; for (int i=1;i<=n-1;i++) cin >> c[i]; int sum=0; for (int i=1;i<=n;i++) { int x=a[i]; //x是当前的坐标 sum+=b[x]; //先吃b[x] if(a[i-1]==a[i]-1) sum+=c[x-1]; } cout << sum << endl; return 0; }
R - Maximal Value
题意:
给你一个B数组,让你找出一个A数组使得:Bi >= max(Ai,Ai+1)
思路:一个B可以决定两个A,直接看代码吧,不太好说。
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int a[1000005]; int b[1000005]; int main() { for (int i=1;i<=1000;i++) b[i]=100005;//将b数组改成最大值 int n; cin >> n; for (int i=1;i<=n-1;i++) { cin >> a[i]; } for (int i=1;i<=n-1;i++) { if(a[i]<b[i]) b[i]=a[i]; if(a[i]<b[i+1]) b[i+1]=a[i]; } ll sum=0; for (int i=1;i<=n;i++) { sum+=b[i] ; } cout << sum << endl; }
S - Face Produces Unhappiness
题意/思路:
给你N个人,这些人站成一列,且每个人都向左转或者向右转,如果一个人左面的人跟他的方向是一样的,那么他就是一个开心的人。
现在给你K次机会,你可以选择0~K次操作,每次操作,你可以选择[l,r]范围内的人改变方向,也就是左变成右,右变成左。
很容易得到,如果不是在进行一次改变所有人都是一个方向的情况下,每次转变可以改变两个人。具体情况看代码吧。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { int n , K; cin >> n >> K; string s; cin >> s; int len = s.length(); int ans = 0; for(int i=1;i<len;i++) //找出原来的开心的人 { if(s[i]==s[i-1]) ans++; } ans = min(2*K + ans , n-1); //最大的开心的人是n-1个 cout << ans << endl; return 0; }
T - Tenki
题意/思路:
给你两个字符串,让你判断多少次对应位置的字符是相同的。长度是3.
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int main() { string s1,s2; cin >> s1 >> s2; int sum=0; for (int i=0;i<=2;i++) { if(s1[i]==s2[i]) sum++; } cout << sum << endl; }
U - Power Socket
题意/思路:
一开始有一个插座,每次转化可以多加A-1个,问你多少次转化可以大于等于B
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <sstream> #include <map> #include <set> #include <queue> #include <stdlib.h> #include <fstream> using namespace std; typedef long long ll; int main() { int a,b; cin >> a >> b; int x=b-1; if(x%(a-1)==0) cout << x/(a-1) << endl; else cout << x/(a-1)+1 << endl; }
V - Lower
题意/思路:
给你一列数,问你最长的连续不升序列(可以小于等于)长度是多少(最后的长度要-1或者长度从0开始)。
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int a[100005]; int main() { int n; cin >> n; for (int i=1;i<=n;i++) { cin >> a[i]; } int sum=0; int ans=0; for (int i=2;i<=n;i++) { if(a[i]<=a[i-1]) sum++; else { ans=max(ans,sum); sum=0; } } ans=max(ans,sum); cout << ans << endl; return 0; }
W - ModSum
题意/思路:
让你求1~n的和(具体怎么转化的请自行体会)
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int a[1000005]; int b[1000005]; int main() { ll n; cin >> n; cout << n*(n-1)/2 << endl; }
X - +-x
题意/思路:
求两个数相加相减相乘的最大值
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; ll a[200005]; //难道又是因为数组的原因导致不会做这道题? int main() { int x,y; cin >> x >> y; cout << max(max(x*y,x-y),x+y) << endl; }
Y - One Clue
题意/思路:
给你两个数,K和X,以X为基准,输出左右两边K-1个数和自己,当然这个范围是-1000000~1000000,所以超出范围部分不计算在内。
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; int a[2000005]; int main() { int k,x; cin >> k >> x; for (int i=x+1000000;i<x+1000000+k;i++) { if(i<=2000000) a[i]=1; } for (int i=x+1000000;i>x+1000000-k;i--) { if(i>=0) { a[i]=1; } } for (int i=0;i<=2000000;i++) { if(a[i]==1) cout << i-1000000 << " "; } cout << endl; }
Z - Green Bin
题意/思路:
给你一个整数N,再给你N个字符串,先对每一个字符串进行字典排序,然后对所有的字符串进行排序,然后求相邻相等的个数就可以了。
AC代码:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <stdlib.h> #include <sstream> #include <map> #include <set> typedef long long ll; using namespace std; string s[100005]; int main() { int n; cin >> n; for (int i=1;i<=n;i++) //先输入字符串,再对每个字符串进行排序 { cin >> s[i]; sort(s[i].begin(), s[i].end()); } sort(s+1,s+1+n); //对所有的字符串进行排序 long long ans=0; long long x=1; for(int i=1;i<=n-1;i++) { if(s[i]==s[i+1]) x++; //如果字符串相等就x++ else //如果不相等,直接算出上一个相同字符串的长度加到ans里面,并且将x重新设为1 { ans+=x*(x-1)/2; x=1; } } ans+=x*(x-1)/2; //最后再进行一遍求长度 cout << ans << endl; //输出最后的长度 return 0; }