div2 .c
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了div2 .c相关的知识,希望对你有一定的参考价值。
https://codeforces.com/contest/1526/problem/C1
stl容器:
1.采用优先队列,将队列中最小值放到队首。
2.由于题目要求,在满足累加值大于等于0的情况下,能喝的最大药剂数量。
3.如果出现负数,减去队列中最小值,则必然为正。
4.最后队列的大小就是最大数量。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[2005];
priority_queue<ll,vector<long long>,greater<ll> > q;
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
ll sum=0;
for(int i=1;i<=n;i++)
{
sum+=a[i];
q.push(a[i]);
if(sum<0)
{
sum-=q.top();
q.pop();
}
}
cout<<q.size()<<endl;
return 0;
}
采用DP方法:
void work(){
ans=0;
cin>>n;
for(ll i=1;i<=n;i++)
cin>>a[i];
memset(f,-1,sizeof(f));
for(ll i=0;i<=n;i++)
f[i][0]=0;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=i;j++){
if(f[i-1][j-1]>=0)
f[i][j]=max(f[i-1][j-1]+a[i],f[i][j]);
if(f[i-1][j]>=0)
f[i][j]=max(f[i][j],f[i-1][j]); //类似最长子序列
}
}
for(ll j=0;j<=n;j++) if(f[n][j]>=0) ans=j;
cout<<ans<<endl;
}
以上是关于div2 .c的主要内容,如果未能解决你的问题,请参考以下文章