2020-11-19日组队赛题解

题目链接

Problem A. Chord

题目大意

给出钢琴上的12个键,每12个为一个周期,然后输入三个字符串,分别代表一个键,A,B,C,如果A和B差4,且B和C差3,输出“Major triad”,如果A和B差3,且B和C差4,输出“Minor triad”,其他情况输出“Dissonance”。

解题思路

暴力找,根据特定的位置关系,得到答案。

代码

#include <iostream>
#include <iostream>
#include <algorithm>
#include <string>
#include <bits/stdc++.h>
using namespace std;
const int N = 50;
const int INF = 0x3f3f3f3f;
struct node
{
    char s[5];
    int num;
};


int main()
{
    node pi[50] = {{"C", 1}, {"C#", 2}, {"D", 3}, {"D#", 4}, {"E", 5},{"F", 6},{"F#", 7}, {"G", 8},{"G#", 9},{"A", 10}, {"A#", 11}, {"B", 12}};
    int t;
    cin >> t;
    char a[5], b[5], c[5];
    while(t--)
    {
        int bb = 0, aa = 0, cc = 0;
        cin >> a >> b >> c;
        for(int i = 0; i < 12; i ++)
        {
            if(strcmp(a, pi[i].s) == 0)
            aa = pi[i].num;
            else if(strcmp(b, pi[i].s) == 0)
            bb = pi[i].num;
            else if(strcmp(c, pi[i].s) == 0)
            cc = pi[i].num;
        }
        if(bb < aa) bb += 12;
        if(cc < bb) cc += 12;
        if(bb - aa == 4 && cc - bb == 3) cout << "Major triad\n";
        else if(bb - aa == 3 && cc - bb == 4) cout << "Minor triad\n";
        else cout << "Dissonance\n";
    }
    return 0;
}

B - Problem Select (水题)

比较最后面的数,要求输出几个,就从小到大输出几个即可。

代码

#include <bits/stdc++.h>

using namespace std;

char str[1010][1010];
int num[1010];

int main()
{

    int t,n,k;
    scanf("%d",&t);
    while(t--)
    {
        int top = 0;
        scanf("%d%d",&n,&k);
        getchar();
        for(int i=0;i<n;i++) scanf("%s",str[i]);
        for(int i=0;i<n;i++)
        {
            int len = strlen(str[i]);
            int sum = 0;
            for(int j=0;j<len;j++)
            {
                if(str[i][j]>='0'&&str[i][j]<='9')
                    sum = sum*10+(str[i][j]-'0');
            }
            num[top++] = sum;
        }
        sort(num,num+top);
        for(int i=0;i<k-1;i++) printf("%d ",num[i]);
        printf("%d\n",num[k-1]);
    }
    return 0;
}

C - String Game

动态规划

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e9 + 7;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s1, s2;
    while (cin >> s1 >> s2) {
        ll i, j, h, a[1001], max = 0;
        for (i = 0; i < s2.size(); i++)a[i] = 0;
        for (i = 0; i < s1.size(); i++) {
            for (j = s2.size() - 1; j >= 0; j--) {
                if (s1[i] == s2[j]) {
                    if (j != 0) a[j] += a[j - 1];
                    else a[j]++;
                    a[j] %= N;
                }
            }
        }
        cout << a[s2.size() - 1] << endl;
    }
    return 0;
}

E - Shorten the Array

题目大意

有一个数组a,给出一个下标i,如果a[i]和a[i+1] 是正整数,你可以让a[i] mod a[i+1]或者让a[i+1] mod a[i] 代替a[i]和a[i+1]。最后输出最小剩余多少个数。

解题思路

找数组和每个余数中的除0以外的最小值,然后遍历数组,找数组中等于最小值的个数(cnt)。如果cnt 为 0,输出1,否则输出cnt / 2上取整。

代码

#include <iostream>
using namespace std;
const int N = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int t;
    cin >> t;
    while(t --)
    {
        int n;
        int cnt = 0;
        cin >> n;
        for(int i = 0; i < n; i ++)
        {
            cin >> a[i];
        }
        int sum = INF;
        for(int i = 0; i < n - 1; i ++)
        {
            sum = min(sum, min(a[i], a[i + 1]));
            if(a[i] % a[i + 1] > 0) sum = min(sum, a[i] % a[i + 1]);
            if(a[i + 1] % a[i] > 0) sum = min(sum, a[i + 1] % a[i]);
        }
        for(int i = 0; i < n; i ++)
        {
            if(a[i] == sum) cnt ++;
        }
        if(cnt == 0) cout << 1 << endl;
        else if(cnt % 2 == 0) cout << cnt / 2 << endl;
        else cout << cnt / 2 + 1 << endl;
    }
    return 0;
}

G - Matrix

题目大意

设一个二维数组,它的值只能为0或1,刚开始都是0,遍历所有位置,将它本身以及行数和列数都是它行列的倍数的位置变成1 - c(c为原来的值)。
求最后数组中1的个数。

解题思路

这是一道数学规律题,通过打出15 * 15的矩阵,可以得出每行1,4,9,16的位置是1,所以1位置之前有1个1,3位置之前有2个1,8位置之前有3个1,15位置之前有4个1,由此得出sqrt(n)和这几个数的联系。得出n
位置之前有sqrt(n)个1,列上的情况同理。
所以最后1的个数为sqrt(n)* sqrt(m);

代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
int Map[10][10];

int main()
{
int t;
    long long  n, m;
    cin >> t;
    while(t --){
    cin >> n >> m;
    long long sum = (long long int)sqrt(n) * (long long int)sqrt(m);
    cout << sum << endl;
    }
}

L - Swimmer (水题)

代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 1e6+10;
ll v[N];

int main()
{

    ll n,m,q;
    scanf("%lld%lld%lld",&n,&m,&q);
    for(int i=1;i<=n;i++) scanf("%lld",&v[i]);
    ll p,k;
    for(int i=0;i<q;i++)
    {
        scanf("%lld%lld",&p,&k);
        ll V = v[k];
        ll len = V*p;
        ll cnt = len/m;
        ll ans;
        if(len>m) ans = len%m;
        else ans = len;
        if(cnt%2==0)
            printf("%lld\n",ans);
        else
            printf("%lld\n",m-ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值