牛客周赛Round29(ABCDE* - Python)

有点数学场的感觉

讲解 讲解

A题

考点:语法

直接根据条件判断就行

a, b = map(int, input().split())
if a > b:
    print('kou')
elif a == b:
    print('draw')
else:
    print('yukari')

B题

考点:语法

主要就是考虑一下四种情况,白天睡/不睡 * 晚上睡/不睡,然后白天不睡晚上睡这种情况特殊处理一下(就是题面所说的提前)

n = int(input())
a = list(input())
b = list(input())
ans = 0
for i in range(n):
    if a[i] == 'Y':
        if b[i] == 'Y':
            ans += 3
        else:
            ans += 2
    else:
        if b[i] == 'Y':
            ans += 2
        else:
            ans += 0
print(ans)

C题(双解)

考点:字符串 / 类哈希

解法1:字符串查找替换

解法2:记录每个字符次数,输出小红之后减掉对应次数,然后把其它有次数的输出一遍

 C1.Python

# 利用字符串操作函数完成:1先找小和红 2替换小和红 3输出小红+替换之后的字符串
# 12在python中可以一步完成
def reset(s):
    # 查找并替换小和红
    s = s.replace('xiao', '', 1)
    s = s.replace('hong', '', 1)
    ans = 'xiaohong' + s
    return ans
s = input()    
print(reset(s))
# 也可以试试 查找 >> 切片 >> 替换 >> 输出的写法

 C2.C++

// Python还在学,暂时用C++顶一下
#include<bits/stdc++.h>
using namespace std;
// 用这个去记录每个字符的出现次数
int cnt[26];

int main()
{
    string s;
    cin >> s;
//  记录次数
    for(auto i : s)
        cnt[i - 'a']++;
    string ss = "xiaohong";
//  删除xiaohong
    for(auto i : ss)
        cnt[i - 'a']--;
//  开始输出
    cout << "xiaohong";
    for(int i = 0; i < 26; ++i)
        while(cnt[i]--)
            cout << char('a' + i);
    return 0;
}

D题(双解)

考点:数学、排序、构造

解法1:一定要找规律(也就是删除一个数中位数会如何变化),会发现当n为奇数偶数时对应两种不同的情况,把两种情况都分析一下,根据位置求答案(模拟写的话会超时)

解法2:利用结构体保存位置后对值排序,遍历排序后的数组根据保存的位置构造出答案(也要用规律),最后输出答案(比赛的时候写的,可能有点绕,推荐解法1)

D1.Python

n = int(input())
l1 = list(map(int, input().split()))
# 利用切片复制一份列表用来排序
l2 = l1[::]
l2.sort()
# 开一个列表用来保存答案
ans = []
# 把答案找齐
if n % 2 == 0:
    ans.append(l2[n // 2 - 1])
    ans.append(l2[n // 2])
if n % 2 != 0:
    ans.append(l2[n // 2 - 1])
    ans.append(l2[n // 2])
    ans.append(l2[n // 2 + 1])
for i in l1:
    if n % 2 == 0:
        if i <= min(ans):
            print('{:.1f}'.format(max(ans)))
        else:
            print('{:.1f}'.format(min(ans)))
    if n % 2 != 0:
        if i <= min(ans):
            print('{:.1f}'.format((ans[1] + ans[2]) / 2))
        elif i>=max(ans):
            print('{:.1f}'.format((ans[1] + ans[0]) / 2))
        else:
            print('{:.1f}'.format((ans[0] + ans[2]) / 2))

D2.C++

#include<bits/stdc++.h>
using namespace std;

struct aa{
    double v;
    int s;
};

bool cmp(aa x, aa y)
{
    if(x.v != y.v)
        return x.v < y.v;
    else
        return x.s < y.s;
}

const int N = 2e5 + 10;
aa a[N];
double b[N];

int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; ++i)
    {
        cin >> a[i].v;
        a[i].s = i;
    }
    sort(a + 1, a + n + 1, cmp);
//    偶数情况
    if(n % 2 == 0)
    {
        int r = a[n / 2 + 1].v;
        int l = a[n / 2].v;
        for(int i = 1; i <= n; ++i)
        {
            if(i <= n / 2)
                b[a[i].s] = r;
            else
                b[a[i].s] = l;
        }
        for(int i = 1; i <= n; ++i)
        {
            cout << fixed << setprecision(1) << 1.0 * b[i] << '\n';
        }
    }
//    奇数情况
    else
    {
        double r = (a[n / 2 + 1].v + a[n / 2 + 2].v) / 2;
        double l = (a[n / 2 + 1].v + a[n / 2].v) / 2;
        double mid = (a[n / 2 + 2].v + a[n / 2].v) / 2;
        for(int i = 1; i <= n; ++i)
        {
            if(i < n / 2 + 1)
                b[a[i].s] = r;
            else if(i == n / 2 + 1)
                b[a[i].s] = mid;
            else
                b[a[i].s] = l;
        }
        for(int i = 1; i <= n; ++i)
        {
            cout << fixed << setprecision(1) << 1.0 * b[i] << '\n';
        }
    }
    return 0;
}

E题(思路)

首先把所有的素因子拆出来,然后判断有无解构造输出,细节推荐看一下讲解视频

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值