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;
}



京公网安备 11010502036488号