Contestant(alt). Rank 6738. Rating -86 (+414 -500).
A. Yet Another Promotion
题意
定义两天内提供购物服务,每天的货物价格分别为
思路
对于
- 前者小,那么我们将能参与促销的货物全都在第一天购买,也就是总共有
个货物是参与了促销。此时,我们得到了 个货物,那么剩余的货物就作为正常购买,我们用 购买即可; - 后者小,直接全都在第二天买即可。
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1010;
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while(t --){
int a, b, n, m;
cin >> a >> b >> n >> m;
cout << min(n * b, (n / (m + 1)) * m * a + (n - (n / (m + 1)) * (m + 1)) * min(a, b)) << '\n';
}
return 0;
}
一个大铸币没看懂题卡了半天
B. Fedya and Array
题意
给出如下定义:
若一个元素的相邻元素都比它大,那么定义其为 local minimum;若一个元素的相邻元素都比它小,那么定义其为 local maximum。
给定一个首尾相连的序列中 local maximum 的总和和 local minimum 的总和
思路
显然,
若
化简即可得到
时间复杂度:
对应AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10, inf = 0x3f3f3f3f;
int a[N];
signed main() {
ios::sync_with_stdio(0);
int t, x, y;
cin >> t;
while(t --){
cin >> x >> y;
vector<int> ans;
for(int i=x;i>y;i--) ans.emplace_back(i);
for(int i=y;i<x;i++) ans.emplace_back(i);
cout << ans.size() << '\n';
for(auto &i : ans) cout << i << ' ';
cout << '\n';
}
return 0;
}
好妙的做法
C. Dora and Search
题意
给定一个排列,输出一段连续区间的左右端点的下标,满足两个端点既不是区间内的最大值,也不是区间内的最小值。
思路
我们可以用类似双指针的方法,从两侧开始夹逼,只要去除区间外的点后,最大值和最小值都不在端点,那就直接输出。
时间复杂度:
对应AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10, inf = 0x3f3f3f3f;
int a[N];
signed main() {
ios::sync_with_stdio(0);
int t, n;
cin >> t;
while(t --){
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
int l = 0, r = n - 1, vl = 1, vr = n;
while(l <= r){
if(a[l] == vl) l ++, vl ++;
else if(a[l] == vr) l ++, vr --;
else if(a[r] == vl) r --, vl ++;
else if(a[r] == vr) r --, vr --;
else break;
}
if(l <= r) cout << l + 1 << ' ' << r + 1 << '\n';
else cout << -1 << '\n';
}
return 0;
}
不是排列的话就只有找拐点了
- 本文链接 https://floating-ocean.github.io/blog_old/posts/185684192/
- 版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!