目录
1.小乐乐改数字
简单把他当成字符串遍历即可。
详细代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
for (int i = 0; i < s.size(); ++i) {
if ((s[i] - '0') % 2 == 0)
s[i] = '0';
else
s[i] = '1';
}
string ret;
int i = 0;
while (s[i] == '0')
i++;
for (; i < s.size(); ++i)
ret += s[i];
if (ret == "")
cout << 0 << endl;
else
cout << ret << endl;
return 0;
}
2.十字爆破
按照题意模拟即可:
我的思路是将每一行每一列的总和都存起来,然后第 i 行第 j 列的数就可以表示为line[i] + col[j] - map[i][j](减掉map位置是因为该位置行列一起遍历会重复,所以要减去一遍)
详细代码:
#include <iostream>
#include <vector>
#define int long long
using namespace std;
const int N = 1e6 + 10;
signed main() {
int n, m;
cin >> n >> m;
int line[N];
int col[N];
vector<vector<int>> v(n, vector<int>(m));
vector<vector<int>> map(n, vector<int>(m));
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
cin >> map[i][j];
for (int i = 0; i < n; ++i) {
int sum = 0;
for (int j = 0; j < m; ++j) {
sum += map[i][j];
}
line[i] = sum;
}
for (int i = 0; i < m; ++i) {
int sum = 0;
for (int j = 0; j < n; ++j) {
sum += map[j][i];
}
col[i] = sum;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
v[i][j] = line[i] + col[j] - map[i][j];
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cout << v[i][j] << ' ';
}
cout << endl;
}
return 0;
}
注意:要开long long,因为数据量太大。
3.比那名居的桃子
我的思路是前缀和预处理来解决的:
存储快乐值和羞耻度的前缀和,然后快乐值总和 sum1 = h[r] - h[l - 1];
羞耻度总和 sum2 = s[r] - s[l - 1];
然后一遍一遍更新出maxh和mins和L即可。
详细代码:
#include <iostream>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int h[N];
int s[N];
int n, k;
int x;
signed main()
{
cin >> n >> k;
cin >> h[0];
for (int i = 1; i < n; ++i)
{
cin >> x;
h[i] = h[i - 1] + x;
}
cin >> s[0];
for (int i = 1; i < n; ++i)
{
cin >> x;
s[i] = s[i - 1] + x;
}
int maxh = 0, mins = 0x3f3f3f3f;
int l = 0, r = 0;
int sum1 = 0;
int sum2 = 0;
int keyi;
while (l < n - k + 1)
{
r = l + k - 1;
if (l > 0)
{
sum1 = h[r] - h[l - 1];
sum2 = s[r] - s[l - 1];
}
else
{
sum1 = h[r];
sum2 = s[r];
}
if (sum1 > maxh)
{
maxh = sum1;
mins = sum2;
keyi = l;
}
else if (sum1 == maxh && sum2 < mins)
{
maxh = sum1;
mins = sum2;
keyi = l;
}
l++;
}
cout << keyi + 1 << endl;
return 0;
}
注意:
当sum2 < 目前最小羞耻度时才更新,这样就能不用考虑下面这点: