Gym 102800部分题解

Gym 102800
A:没什么好说的,直接上代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
map<string,int>p;
int main()
{
    string a;
    string b;
    string c;
    int n;
    cin>>n;
    p["A"]=1;
    p["A#"]=2;
    p["B"]=3;
    p["C"]=4;
    p["C#"]=5;
    p["D"]=6;
    p["D#"]=7;
    p["E"]=8;
    p["F"]=9;
    p["F#"]=10;
    p["G"]=11;
    p["G#"]=12;
    while(n--)
    {
        cin>>a>>b>>c;
        int k,u;
        if(p[b]-p[a]>=0)
        k=p[b]-p[a];
        else k=p[b]+12-p[a];
        if(p[c]-p[b]>=0)
        u=p[c]-p[b];
        else u=p[c]+12-p[b];
        if(k==3&&u==4)
            cout<<"Minor triad"<<endl;
        else if(k==4&&u==3)
            cout<<"Major triad"<<endl;
        else cout<<"Dissonance"<<endl;

    }
}

B:仍然是签到题

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int get(char *ch, int length)
{
    int ans = 0;
    int x = 1;
    for(int i = 1;i<=length;i++)
    {
        ans+=(ch[i]-'0')*x;
        x*=10;
    }
    return ans;
}
int main()
{
    int t;
    cin>>t;
    int n, k;
    char ch[20];
    int a[1110];
    while(t--)
    {
        int cnt1 = 0;
        cin>>n>>k;
        char s[1110];
        for(int i = 1;i<=n;i++)
        {
            cin>>s;
            int len = strlen(s);
            int length = 0;
            for(int i = len-1;s[i]!='/';i--)
            {
                ch[++length] = s[i];
            }
            a[++cnt1] = get(ch,length);
        }
        sort(a+1,a+1+cnt1);
        for(int i = 1;i<=k;i++)
        {
            if(i == 1)
            cout<<a[i];
            else
            cout<<" "<<a[i];
        }
        cout<<endl;
    }
    return 0;
}

C:是一道dp题,这里就不写了,推荐一下其他人的代码
链接 这道题挺典型的,时间也不会卡的太紧,会写dp就能过了

E:是一个思维题,主要思路是小于最小值的数都能被直接去掉。而如果有相同的最小值就输出除以二(上取整)后的结果。需要注意的是最小值不一定是给的值,可能是余出来的
这里给出一种解法,瞎写的,不保证最正确
我的思路是如果给出的值就只有一个最小值就直接输出一,否则将每个数都对最小值取余,看能不能有更小值

#include <stdio.h>
#include <string.h>
typedef long long ll;
const int maxn = 1e9 + 7;
ll a[1000010];
int main()
{
    ll t, n;
    int flag;
    scanf("%lld",&t);
    while(t--)
    {
        flag=0;
        ll minn=1e9+15;
        ll count_one=1;
        scanf("%lld",&n);
        for(ll i=0; i<n; i++)
        {
            scanf("%lld",&a[i]);
            if(minn>a[i])
            {
                minn=a[i];
                count_one=1;
            }
            else if(minn==a[i])
                count_one++;
        }
        if(count_one==1)
            printf("1\n");
        else if(count_one!=1)
        {
            for(int i=0; i<n; i++)
            {
                if(a[i]%minn!=0)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)
            {
                printf("1\n");
                continue;
            }
            if(count_one%2!=0)
                count_one+=1;
            printf("%lld\n", count_one/2);
        }
    }
    return 0;
}

G:找规律 这种题就打个表(就是将各种情况用暴力写出来)看看有什么规律
易知 不管输入是几 打出来的表都是一样的 只有当一个点的横纵坐标都是平方数这个点才会是一 要用到两个函数,开方函数和下取整函数

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll n,m;
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        n=floor(sqrt(n));
        m=floor(sqrt(m));
        cout<<n*m<<endl;
    }
    return 0;
}

时间关系,其他的不写了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值