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为一个周期这样的一个规律。
-
确定其所在的周期编号 c=(k−1)/7c=(k−1)/7。
-
确定其在当前周期中的位置 fww=(k−1)%7+1fww=(k−1)%7+1。
-
利用预计算数组
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;
}