A: 雪崩
B:模拟经营游戏
C:心急吃不了热豆腐
D:UNIX时间戳
E:三扇门
F:魔法计算器
G:禁止套娃
H:文件在哪里
I:总之就是非常酸
J:新冠病毒快走开
题目链接
A:雪崩
Ac code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int a, b, c, n, cnt;
int main(void)
{
cin >> n;
for(int i = 1; i <= n; i ++ )
{
cin >> a >> b >> c;
int tmp = a + b + cnt - c;
if(tmp < 0) cnt = 0;
else cnt = tmp;
}
cout << cnt;
return 0;
}
B:模拟经营游戏
a, b, c数组分别记录前n行每一列的前缀和。对于m个查询,二分查询第一个大于等于触发天数的位置, 进行三次操作, 然后三个取一个最大值, 如果最大值大于n 则说明时间不会被触发。否则输出最大值。
Ac code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
typedef long long ll;
ll a[maxn], b[maxn], c[maxn];
int main(void)
{
int n, m, num1, num2, num3;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i ++ )
{
scanf("%d %d %d", &num1, &num2, &num3);
a[i] = a[i - 1] + num1; b[i] = b[i - 1] + num2; c[i] = c[i - 1] + num3;
}
int pos1, pos2, pos3;
while(m -- )
{
scanf("%d %d %d", &num1, &num2, &num3);
pos1 = lower_bound(a, a + n + 1, num1) - a;
pos2 = lower_bound(b, b + n + 1, num2) - b;
pos3 = lower_bound(c, c + n + 1, num3) - c;
int tmp = max(pos1, max(pos2, pos3));
if(tmp > n) printf("-1");
else printf("%d", tmp);
if(m) printf(" ");
}
return 0;
}
C:心急吃不了热豆腐
将输入数据排序, 从最大的数开始往前枚举, 如果加上当前的数据可以使满意度增加,则加上这块豆腐的品质*等待时间(这里我用sum来记录),否则直接退出(因为越往前,等待时间越长,豆腐的品质也越低, 对满意度增加的负面影响越大)
Ac code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> vec;
int main(void)
{
int num, n;
while(~scanf("%d", &num)) vec.push_back(num);
sort(vec.begin(), vec.end());
n = vec.size();
ll ans = 0, sum = 0;
for(int i = n - 1; i >= 0; i -- )
{
sum += vec[i];
if(ans < ans + sum) ans = ans + sum;
else break;
}
cout << ans;
return 0;
}
D:UNIX时间戳
Ac code
这题 貌似用pthon做比较简单, 然后就不解释了。
import time
T, ans = eval(input()), list()
for i in range(T):
n = int(input())
m = time.localtime(n + 28800)
t = time.strftime("%Y-%m-%d %H:%M:%S", m)
ans.append(t)
for i in ans:
print(i)
E:三扇门
print("2/3")
F: 魔法计算器
这个题需要注意点就是输入数据不要忘记开long long,否则在进行加法和乘法的时候可能会爆int
Ac code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(void)
{
int T;
cin >> T;
while(T -- )
{
char a1, ch, b2;
ll a, b;
scanf("%lld %c %lld", &a, &ch, &b);
if(ch == '/')
{
if(a == 0) printf("0.00");
else if(b == 0) printf("abandon");
else printf("%.2lf", double(a * 1.0) / double(b * 1.0));
}else if(ch == '+')
{
if(a + b > INT_MAX || a + b < INT_MIN) printf("abandon");
else cout << a + b;
}else if(ch == '-')
{
if(a - b < INT_MIN) printf("abandon");
else cout << a - b;
}else if(ch == '*')
{
if(a * b > INT_MAX || a * b < INT_MIN) printf("abandon");
else cout << a * b;
}
if(T) cout << endl;
}
return 0;
}
G:禁止套娃
这题是一道广搜题(貌似深搜也可以过),按照平时学的搜索写就可以了。
Ac code
#include <bits/stdc++.h>
using namespace std;
int dx[] = {-1, 1, 3, 3, 1, -1, -3, -3}, dy[] = {3, 3, 1, -1, -3, -3, -1, 1};
int arr[109][109], step[109][109];
int main(void)
{
int n, x1, x2, y1, y2, cnt = 0;
cin >> n;
while(~scanf("%d %d %d %d", &x1, &y1, &x2, &y2))
{
cnt ++;
queue<pair<int, int> > q;
q.push({x1, y1});
memset(arr, 0, sizeof(arr));
memset(step, 0, sizeof(step));
arr[x1][y1] = 1;
bool f = false;
int ans = 0;
while(!q.empty())
{
int u = q.front().first, v = q.front().second;
q.pop();
if(u == x2 && v == y2)
{
f = true;
ans = step[u][v];
break;
}
int tx, ty;
for(int i = 0; i < 8; i ++ )
{
tx = u + dx[i], ty = v + dy[i];
if(tx >= 0 && ty >= 0 && tx <= n && ty <= n && arr[tx][ty] == 0)
{
step[tx][ty] = step[u][v] + 1;
arr[tx][ty] = 1;
q.push({tx, ty});
}
}
}
if(f && ans <= n * n) cout << ans << endl;
else cout << "hitch!" << endl;
}
return 0;
}
H:文件在哪里
既然题目给了python 中的 os.path.join , 那直接用就行了。
Ac code
import os
t, arr, str = eval(input()), list(), ""
for i in range(t):
arr.append(input())
for i in arr:
str = os.path.join(str, i)
str, ch = list(str), '\\'
print("'", end = "")
for i in range(len(str)):
if ch == str[i]:
str[i] = '/'
print(str[i], end = "")
print("'", end = "")
I:总之就是非常酸
需要注意一点的就是如果差值超过30年, 那就按找30年算。
Ac code
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
int n;
cin >> n;
n -= 2020;
if(n > 30) n = 30;
int a = 0, b = 0, c = 0, d = 80, e = 40, f = 30;
for(int i = 0; i < n; i ++ )
{
a += d, b += e, c += f;
d += 10, e += 10, f += 10;
}
cout << a << " " << b << " " << c;
return 0;
}
J: 新冠病毒快走开
这个题直接按照题目给出的条件判断就可以了。
Ac code
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
int n, num, sum1 = 0, sum2 = 0;
cin >> n;
for(int i = 0; i < n; i ++ )
{
cin >> num;
if(num < 4) sum1 ++;
else if(num >= 4 && num < 13) sum1 += 2;
else if(num >= 13) sum1 += 3, sum2 ++;
}
cout << sum1 << " " << sum2;
return 0;
}