耻辱的一场cf。。。爆零了,虽然但是竟然还给我加分了,表扬cf.
A. Recycling Center
运用贪心思维,若想让花费的硬币最少,让原本就大于c的放在最后面,因为不管乘几次2还是要消耗1个硬币,然后小于c的按从大到小排列,因为大乘以2之后更容易大于c,所以先处理大的。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define int long long
#define PII pair<int,int>
#define fi first
#define se second
#define endl '\n'
const int N=1e6+6;
int n,a[106],c;
void solve()
{
int ans=0;
cin>>n>>c;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
for(int i=n;i>=1;i--)
{
if(a[i]>c)ans++;
else
{
if(a[i]>c)
ans++;
c/=2;
}
}
cout<<ans<<endl;
}
signed main()
{
IOS;
int _=1;
cin>>_;
while(_--)
solve();
return 0;
}
B. Deque Process
这道题要求操作后使数组没有连续5个及以上的连续递增或递减数组,可以有两种操作,L选最左边的数并删除,R选最右边的数并删除,我们可以依次从最左边和最右边拿一个数,但要注意为了不让数组有连续递增或递减,那么就要控制如果第一次拿的两个数的顺序是递增,那么下一次就要是递减的,依次类推。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define int long long
#define PII pair<int,int>
#define fi first
#define se second
#define endl '\n'
const int N=1e6+6;
void solve()
{
int n;
cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++)
cin>>a[i];
int l=1,r=n;
bool f=0;
while(l<r)
{
if(f)
{
if(a[l]<a[r])cout<<"LR";
else cout<<"RL";
}
else
{
if(a[l]<a[r])cout<<"RL";
else
cout<<"LR";
}
if(f)f=0;
else f=1;
l++;
r--;
}
if(l==r)
cout<<"L";
cout<<endl;
}
signed main()
{
IOS;
int _=1;
cin>>_;
while(_--)
solve();
return 0;
}
C. Leftmost Below
题目要求判断给定目标数组 b₁, b₂, …, bₙ 是否可通过特定操作从全 0 初始数组构造得到。操作规则是选大于当前数组最小值的 x,找到第一个小于 x 的元素位置 i,将 a[i] 增加 x 。需分析目标数组满足的条件,判断能否构造。通过观察操作特性,发现构造过程中数组元素需满足 “非递减序列” 且 “当前元素不超过前一个元素的 2 倍” 。核心逻辑是:从前往后遍历目标数组,用最小堆(优先队列)维护已遍历元素的最小值,若当前元素大于等于堆顶元素的 2 倍,说明无法构造,返回 NO;否则继续,遍历完则返回 YES 。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define int long long
#define PII pair<int,int>
#define fi first
#define se second
#define endl '\n'
const int N=1e6+6;
void solve()
{
int n;cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
priority_queue<int,vector<int>,greater<int>>q;
q.push(a[1]);
for(int i=2;i<=n;i++)
{
if(a[i]>=q.top()*2)
{
cout<<"NO"<<endl;
return ;
}
q.push(a[i]);
}
cout<<"YES"<<endl;
}
signed main()
{
IOS;
int _=1;
cin>>_;
while(_--)
solve();
return 0;
}