Codeforces Round 980 (Div. 2)
A. Profitable Interest Rate
降到最高的限度,特判
B. Buying Lemonade
对于每次按,最坏的情况就是空的,之后记住这个是空的
所以优先保证不空
先每个按mi次,必然都不空
再就可能按空的,最坏就是把空的都按到,再就又可以按mi次
最后发现也就是较少的一半按钮要按空,挨个模拟
#include<iostream>
using namespace std;
#include<algorithm>
#define ll long long
ll a[200010];
ll n,k;
int main(){
ll T;cin>>T;
while(T--){
cin>>n>>k;
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+n+1);
// if(k<=n*a[1]){
// prllf("%d\n",k);continue;
//}
ll ans=0;
ll pos=1;
while(1){
if(k<=(n-pos+1)*(a[pos]-a[pos-1])){
ans+=k;break;
}
k-=(n-pos+1)*(a[pos]-a[pos-1]);ans+=(n-pos+1)*(a[pos]-a[pos-1]);
pos++;ans++;
}
printf("%lld\n",ans);
}
}
C. Concatenation of Arrays
就是第一个从小到大
神人
#include<iostream>
using namespace std;
#include<map>
#include<vector>
#include<algorithm>
#define ll long long
const ll N=100010;ll n;
struct Node{
ll x,y,idx;
}node[N];
ll pre[N];
map<ll,ll> mp;
bool cmp(Node a,Node b){
if(min(a.x,a.y)!=min(b.x,b.y))
return min(a.x,a.y)<min(b.x,b.y);
else
return max(a.x,a.y)<max(b.x,b.y);
}
vector<pair<ll,ll>> b;
int main(){
ll T;cin>>T;
while(T--){
cin>>n;mp.clear();b.clear();
for(ll i=1;i<=n;i++){
scanf("%lld%lld",&node[i].x,&node[i].y);
mp[node[i].x]++;mp[node[i].y]++;node[i].idx=0;
}
sort(node+1,node+n+1,cmp);
for(ll i=1;i<=n;i++){
printf("%lld %lld ",node[i].x,node[i].y);
}printf("\n");
}
}
D. Skipping
总有一个最大到达的位置,到最大位置之后,必是把前面所有没取的都取上最好
可以用pre[i]-f[i]计算
f[i]为到i最少舍弃的,拓扑序不好找,用dijk
#include<iostream>
#include<queue>
using namespace std;
#define ll long long
#define pll pair<ll,ll>
const ll N=400010;
ll a[N];ll n;ll b[N];ll f[N];ll pre[N];
bool st[N];
priority_queue<pll,vector<pll>,greater<pll>> heap;
void dijk(){
for(int i=1;i<=n;i++)st[i]=0;
heap.push({f[1],1});
while(!heap.empty()){
pll t=heap.top();heap.pop();
ll i=t.second;
if(st[i])continue;st[i]=1;
if(f[b[i]]>f[i]+a[i]){
f[b[i]]=f[i]+a[i];
// cout<<"push"<<f[b[i]]<<" "<<b[i]<<endl;
heap.push({f[b[i]],b[i]});
}
if(i>1&&f[i-1]>f[i]){
f[i-1]=f[i];
heap.push({f[i-1],i-1});
}
}
}
int main(){
ll T;cin>>T;
while(T--){
cin>>n;
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
for(ll i=1;i<=n;i++)scanf("%lld",&b[i]);
for(ll i=1;i<=n;i++)pre[i]=pre[i-1]+a[i];
/*for(ll i=1;i<=n;i++){
f[b[i]]=min(f[b[i]],f[i]+a[i]);
}*/
for(ll i=1;i<=n;i++)f[i]=1e17;f[1]=0;
dijk();
ll ans=a[1];
for(ll i=1;i<=n;i++){
ans=max(ans,pre[i]-f[i]);
}
printf("%lld\n",ans);
}
}

浙公网安备 33010602011771号