Codeforces Round #811 (Div. 3)
A.Everyone Loves to Sleep
题目大意
给定入睡时间和定的若干个闹钟时间,问最多能睡多久
解题思路
简单模拟
具体代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
const int MOD = 1e9 + 7;
int n, H, M;
int h[N], m[N];
PII ans[N];
bool cmp(PII a, PII b)
{
if (a.first == b.first)
return a.second < b.second;
return a.first < b.first;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T;
cin >> T;
// T = 1;
while (T--)
{
cin >> n >> H >> M;
for (int i = 1; i <= n; i++)
cin >> h[i] >> m[i];
for (int i = 1; i <= n; i++)
{
int hour1, minute1;
int hour2, minute2;
int hour, minute;
hour1 = H, hour2 = h[i], minute1 = M, minute2 = m[i];
if (minute2 < minute1)
{
minute = minute2 + 60 - minute1;
hour2--;
}
else
minute = minute2 - minute1;
if (hour2 < hour1)
hour = hour2 + 24 - hour1;
else
hour = hour2 - hour1;
ans[i] = {hour, minute};
}
sort(ans + 1, ans + n + 1, cmp);
cout << ans[1].first << ' ' << ans[1].second << '\n';
}
return 0;
}
B.Remove Prefix
题目大意
给一个数组,最少删除前面多少个数能使剩下数组不含重复数
解题思路
从后往前用$map$记录
具体代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int MOD = 1e9 + 7;
int n;
int a[N];
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T;
cin >> T;
// T = 1;
while (T--)
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
map<int, int> S;
int t = 0;
for (int i = n; i >= 1; i--)
{
if (S[a[i]] != 0)
{
t = i;
break;
}
S[a[i]] = 1;
}
cout << t << '\n';
}
return 0;
}
C.Minimum Varied Number
题目大意
给定$n$,构造出一个最小的数,这个数每一位都不相同,且每一位上的数字相加的和等于$n$
解题思路
简单贪心,要构造出最小,就是要数字位数尽量少,且小的数字在高位
于是从$9$向$1$枚举,能减则减,减完了以后记录,再从$1$至$9$输出
具体代码
#include <bits/stdc++.h>
using namespace std;
const int N = 100 + 10;
const int MOD = 1e9 + 7;
int n;
int c[N];
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T;
cin >> T;
// T = 1;
while (T--)
{
memset(c, 0, sizeof c);
cin >> n;
for (int i = 9; i >= 1; i--)
{
if (n >= i)
{
n -= i;
c[i]++;
}
}
for (int i = 1; i <= 9; i++)
if (c[i])
cout << i;
cout << '\n';
}
return 0;
}