牛客小白月赛110

A智乃办赛

思路:用group表示是第几个大写英文字母,以A为基础,(n-1)/500为几则往上加几,从而得到应有的字母,用number表示当前组内的编号,(n-1)%500+1表示,至于最后的前导0,在输出的时候控制就行了。

#include <iostream>
#include <string>
using namespace std;

int main() {
    int n;
    cin >> n;

    int group = (n - 1) / 500; 
    // 当前组内的编号
    int number = (n - 1) % 500 + 1; 

    // 计算字母部分
    char letter = 'A' + group;

    // 格式化输出,三位数字不足补0
    printf("%c%03d\n", letter, number);

    return 0;
}

BWordle

思路:就跟着题意走即可,创立三个string,一个放后台单词,一个放玩家单词,一个记录最后结果result,首先全部初始化为红色,然后按照要求依次改绿色和黄色,在检测黄色之前,我们要先利用for循环记录每个字母的出现次数,只要字母标号为'r'且字母出现次数大于0时,就把他标记为黄色。

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

// 检查每个位置的字母颜色
string checkWord(const string& target, const string& guess) {
    string result(8, 'r'); // 初始化所有位置为红色
    unordered_map<char, int> charCount;

    // 统计目标单词中每个字母的出现次数
    for (char c : target) {
        charCount[c]++;
    }

    // 第一遍:标记绿色(位置和字母都正确)
    for (int i = 0; i < 8; ++i) {
        if (guess[i] == target[i]) {
            result[i] = 'g';        
        }
    }

    // 第二遍:标记黄色(字母正确但位置不对)
    for (int i = 0; i < 8; ++i) {
        if (result[i] == 'r' && charCount[guess[i]] > 0) {
            result[i] = 'y';
        }
    }

    return result;
}

int main() {
    string target, guess;
    cin >> target >> guess;

    // 检查结果
    string result = checkWord(target, guess);
    cout << result << endl;

    // 判断是否猜对
    if (result == "gggggggg") {
        cout << "congratulations" << endl;
    } else {
        cout << "defeat" << endl;
    }

    return 0;
}

C智乃的数字

思路:感觉这道题思路挺简单的,但是不知道为什么一直运行超时,段错误。然后结束后看了别人的代码,我认识到可以用周期来代替暴力查找从而解决此类问题。至于是如何发现这个规律的呢,我认为就是多列枚举几个数,原作者是枚举了14个数,发现以30为一个周期这样的一个规律。

  1. 确定其所在的周期编号 c=(k−1)/7c=(k−1)/7。

  2. 确定其在当前周期中的位置 fww=(k−1)%7+1fww=(k−1)%7+1。

  3. 利用预计算数组 a[fww] 获取偏移量,将其与周期起点相加即可得到结果

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[8]={0,3,5,9,15,21,25,27};
//3 5 9 15 21 25 27 33 35 39 45 51 55 57
int main(){
    int t=1;
    cin>>t;
    while(t--){
        int k;
        cin>>k;
        LL c=k/7;
        if(k%7==0) c--;
        int fww=k%7;
        if(fww==0) fww=7;
        cout<<c*30+a[fww]<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值