A-游游画U_牛客周赛 Round 1 (nowcoder.com)
给你一个数字,然后看图找规律模拟把U模拟出来,方法有点简单(笨)
#include
#include
#include
using namespace std;
int main() {
// ::freopen("G:\\Desktop\\untitled\\input.txt", "r", stdin);
// ::freopen("G:\\Desktop\\untitled\\output.txt", "w", stdout);
int n;
cin >> n;
for(int i = 1; i <= 3 * n; i++){
for(int j = 1; j <= n; j++) std::cout << "*";
for(int j = 1; j <= n; j++) std::cout << ".";
for(int j = 1; j <= n; j++) std::cout << ".";
for(int j = 1; j <= n; j++) std::cout << "*";
std::cout << std::endl;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++) std::cout << ".";
for(int j = 1; j <= n; j++) std::cout << "*";
for(int j = n - i; j; j--) std::cout << ".";
for(int j = n - i; j; j--) std::cout << ".";
for(int j = 1; j <= n; j++) std::cout << "*";
for(int j = 1; j <= i; j++) std::cout << ".";
std::cout << std::endl;
}
}
B-游游的数组染色_牛客周赛 Round 1 (nowcoder.com)
根据第三行给的字符串,将第二行对应的数字分别存储在一个vector和map之中,vector中存放着字符B对应的数字, map中存放字符‘R’对应的数字出现的次数。遍历vector,统计每个元素在map中的值。最后的统计值就是答案。
#include
#include
#include
#include
#include
#define int long long
constexpr int N = 200010;
int a[N];
std::vector b;
std::unordered_map Hash;
signed main() {
// ::freopen("G:\\Desktop\\untitled\\input.txt", "r", stdin);
// ::freopen("G:\\Desktop\\untitled\\output.txt", "w", stdout);
int n;
std::cin >> n;
for(int i = 0; i < n; i++) std::cin >> a[i];
std::string s;
std::cin >> s;
for(std::size_t i = 0; i < s.length(); i++){
if(s[i] == 'B') b.push_back(a[i]);
else Hash[a[i]]++;
}
int ans = 0;
for(const auto &ix : b) {
ans += Hash[ix];
}
std::cout << ans << std::endl;
}
C-游游的交换字符_牛客周赛 Round 1 (nowcoder.com)
这个会需要进行分类讨论,如果字符串长度是奇数,那么只有比较多的那个字符排在第一个才能满足条件——例如"10101","010";此时我们统计不在对应位置的字符在字符串中的下标,记录在两个vector里面(因为是从0开始遍历的,所以两个vector中统计的序列是有序的) ,然后遍历一下,统计一下对应位置相减的绝对值的和即可。如果是相同的,那么无法判断第一位是‘0’需要变化得少还是首位是‘1’变化得少,此时需要两种都进行统计一下,求出两种情况之中的 最小值即是结果。
#include
#include
#include
#include
#include
#define int long long
std::string s;
std::vector v1, v2;
int solve(char a, char b){
v1.clear();
v2.clear();
for(std::size_t i = 0; i < s.length(); i += 2) if(s[i] != a) v1.push_back(i);
for(std::size_t j = 1; j < s.length(); j += 2) if(s[j] != b) v2.push_back(j);
int res = 0;
for(std::size_t i = 0; i < v1.size(); i++){
res += std::abs(v1[i] - v2[i]);
}
return res;
}
signed main() {
//::freopen("G:\\Desktop\\untitled\\input.txt", "r", stdin);
//::freopen("G:\\Desktop\\untitled\\output.txt", "w", stdout);
std::cin >> s;
int cnt_0 = 0, cnt_1 = 0;
for(std::size_t i = 0; i < s.length(); i++){
if(s[i] == '1') cnt_1++;
else cnt_0++;
}
if(cnt_1 > cnt_0) std::cout << solve('1', '0') << std::endl;
else if(cnt_0 > cnt_1) std::cout << solve('0', '1') << std::endl;
else if(cnt_1 == cnt_0){
std::cout << std::min(solve('1', '0'), solve('0', '1')) << std::endl;
}
return 0;
}
D-游游的9的倍数_牛客周赛 Round 1 (nowcoder.com)
已知:能够被9整除的数的每位上的数的和相加是一定能够被9整除的;
例如——18,27,36,45,54,90,180
那么我们可以统计子序列的每位数字上的和(对9求模)出现的次数,然后dp背包跑一遍,最后需要的结果就是余数为0(dp[n][0])的结果。
#include
#include
#include
#include
#include
#define int long long
constexpr int mod = 1e9 + 7;
int dp[200005][10];
signed main() {
//::freopen("G:\\Desktop\\untitled\\input.txt", "r", stdin);
//::freopen("G:\\Desktop\\untitled\\output.txt", "w", stdout);
std::string s;
std::cin >> s;
int n = s.size();
for (int i = 0; i < n; i++) {
int x = s[i] - '0';
dp[i + 1][x % 9] = (dp[i + 1][x % 9] + 1) % mod;
for (int j = 0; j < 9; j++) {
dp[i + 1][j] = (dp[i + 1][j] + dp[i][j]) % mod;
dp[i + 1][(j + x) % 9] = (dp[i + 1][(j + x) % 9] + dp[i][j]) % mod;
}
}
std::cout << dp[n][0] << std::endl;
return 0;
}
总结:距离AK就差了两三分钟(还是自己太弱了),最后交题的时候才发现已经超时了几分钟。主要就是问题三当时没发现偶数需要取最小值的情况啦。
第一次写题解,感觉有很多地方描述不清楚,233。