A.谜题:质数
思路:输出本身即可
void solve()
{
int n; cin >> n;
cout << n;
}
B.Kevin逛超市 2 (简单版本)
思路:只考虑最后两个数,去最小即可。
void solve()
{
int n; cin >> n;
double x;
int y;
cin >> x >> y;
vector<int>a(n);
for (int i = 0; i < n; i++) cin >> a[i];
sort(a.begin(), a.end());
double ans = max(0, a[n - 2] - y) + a[n - 1] * x * 1.0 / 100;
//cout << fixed << setprecision(9) << min(ans, a[1] - y + a[0] * x / 100) << endl;
ans = min(ans, max(a[n - 1] - y,0) + a[n - 2] * x / 100);
//int pos = lower_bound(a.begin(), a.end(), y) - a.begin();
double sum = 0;
for (int i = 0; i < n - 2; i++) {
sum += a[i];
}
printf("%.13lf\n",sum + ans);
}
C.被遗忘的书籍
思路: d p dp dp。找含 t x t txt txt种类的的合法数量不好找,那就找不合法的,用所有可能减去这个不合法的数量就是答案。
ll f[N][3];
ll p[N],ans[N];
void solve()
{
int n; cin >> n;
cout << ans[n] << endl;
}
int main()
{
int _ = 1;
f[0][0] = 1;
for (int i = 1; i <= N; i++) {
f[i][0] = (f[i - 1][1] * 24 + f[i - 1][2] * 25 + f[i - 1][0] * 25) % MOD;
f[i][1] = (f[i - 1][1] + f[i - 1][0]) % MOD;//选t
f[i][2] = f[i - 1][1] % MOD;
ans[i] = (ans[i - 1] * 26 + f[i - 1][2]) % MOD;
}
cin >> _;
while (_--)
solve();
}
D.Kevin逛超市 2 (困难版本)
思路:折扣券和立减券的使用都是连续的一段,因此,从最大的开始操作,在 a + b a + b a+b 个操作中排序取最大的那几个,用总数减去这优惠金额即可。
void solve()
{
int n, a, b, x, y;
cin >> n >> a >> b >> x >> y;
double sum = 0, cnt = 0;
vector<int> p(2 * n);
for (int i = 0; i < n; i++) {
cin >> p[i];
sum += p[i];
}
sort(p.begin(), p.end(), [](int a, int b) { return a > b; });
vector<double> vec(a + b);
for (int i = 0; i < a + b; i++) {
vec[i] = p[i] * (100 - x) * 1.0 / 100 - min(p[i], y), cnt += min(p[i], y);
}
sort(vec.begin(), vec.end(), [](double a, double b) {return a > b; });
for (int i = 0; i < a; i++) {
cnt += vec[i];
}
cout << fixed << setprecision(12) << sum - cnt << endl;
}