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