A题:Shout Everyday
题意
给定入睡时间和起床时间,再给出一个喊叫的时间,问能否喊叫
思路
就看喊叫时间是否在起床时间和入睡时间之间即可。
如果给出的数值小于起床时间,那么加上24小时移到第二天即可
代码
inline void solve() {
int a, b, c; cin >> a >> b >> c;
if (a < c) a += 24;
if (b < c) b += 24;
if (a >= c && a <= b) cout << "Yes";
else cout << "No";
return;
}
B题:Cut .0
题意
给定一个有三位小数的浮点数,要求除去多余的0,并且如果小数点后面没有0的话,也要将小数点除去。
思路
字符串模拟
从后往前看3位,如果是0我们就除去,否则就停止
如果除去三个的话,我们再pop一次将小数点除去。
代码
inline void solve() {
string s; cin >> s;
int n = s.size() - 1;
for (int i = n; i >= n - 2; i -- ) {
if (s[i] == '0') {
if (i == n - 2) s.pop_back();
s.pop_back();
}else break;
}
cout << s << endl;
return;
}
C题:Enumerate Sequences
题意
要求构造所有长度为n的数组,其中各个位置上的元素大小有限制,并且总和要求是k的倍数。将所有满足题意的数组打印出来。
思路
数据范围极小,直接暴力dfs即可
代码
inline void solve() {
int n, k; cin >> n >> k;
vector<int> a(n + 1);
for (int i = 1; i <= n; i ++ ) cin >> a[i];
function<void(int, vector<int>)> dfs = [&](int x, vector<int> path) {
if (x == n + 1) {
int sum = 0;
for (int c : path) sum += c;
if (sum % k == 0) {
for (int c : path) cout << c << ' ';
cout << endl;
}
return;
}
for (int i = 1; i <= a[x]; i ++ ) {
path.push_back(i);
dfs(x + 1, path);
path.pop_back();
}
};
vector<int> p;
dfs(1, p);
return;
}
D题:Pedometer
题意
n个休息区环绕着一个湖,在每个休息区可以花费ai步顺时针前往下一个休息区。以任意休息区为起点,再以除其外的休息区为终点,在最少步的走法下,步数是m的倍数的情况有几种。
思路
“最少步的走法,那么就不可能再回到起点”
所以我们肯定最多只能走n-1个休息区
因为是环形,最简单的做法是两倍大小,破环成链
vector<ll> a(2 * n + 1);
for (int i = 1; i <= n; i ++ ) cin >> a[i], a[i + n] = a[i];
因为时间限制,我们当然先考虑O(n)扫的情况
对于休息区i,我们往前考虑其前面的休息区作为起点的可能情况
我们不可能去进行枚举操作。但是我们可以用一个前缀和来记录“状态”
如果当前位置的前缀和是cur%m,那么我们就要再前面找到前缀和是cur%m的数量有多少个,这样就可以直接得出其中是m倍数的情况有多少个了。
在破环成链的情况下,如果i可以成为起点了,那么我们就将dp[pre[i-1]]加上一(不是pre[i])
而其不能成为起点的话,我们就将dp[位置]减去一
总的是从1到2n-1
代码
const int N = 1e6 + 9;
int dp[N];
inline void solve() {
int n, m; cin >> n >> m;
vector<ll> a(2 * n + 1);
for (int i = 1; i <= n; i ++ ) cin >> a[i], a[i + n] = a[i];
for (int i = 1; i <= 2 * n; i ++ ) a[i] += a[i - 1];
ll ans = 0;
for (int i = 1; i <= 2 * n - 1; i ++ ) {
ll cur = a[i] % m;
if (i >= n) {
if (i == n) dp[a[i - 1] % m] += 1;
dp[a[i - n] % m] -= 1;
ans += dp[cur];
}else {
dp[a[i - 1] % m] += 1;
ans += dp[cur];
}
}
cout << ans << endl;
return;
}