Codeforces Round #622 Div. 2
比赛链接 https://codeforces.com/contest/1313
比赛记录 https://blog.csdn.net/cheng__yu_/article/details/105395197
A. Fast Food Restaurant
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5,maxm=1e5+5;
const int mod=1e9+7,inf=0x7f7f7f7f;
int t,a,b,c;
int main()
{
cin>>t;
while(t--)
{
cin>>a>>b>>c;
if(a>b) swap(a,b);
if(a>c) swap(a,c);
if(b>c) swap(b,c);
int ans=0;
if(a>=1)
a--,ans++;
if(b>=1)
b--,ans++;
if(c>=1)
c--,ans++;
if(a>=1&&c>=1)
a--,c--,ans++;
if(b>=1&&c>=1)
b--,c--,ans++;
if(a&&b)
a--,b--,ans++;
if(a&&b&&c)
ans++;
cout<<ans<<"\n";
}
return 0;
}
B. Different Rules(思维)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5,maxm=1e5+5;
const int mod=1e9+7,inf=0x7f7f7f7f;
int t,n,a,b;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>a>>b;
int maxx=min(a+b-1,n);
int minn;
if(a+b<n+1)
minn=1;
else
minn=min(a+b+1-n,n);
cout<<minn<<" "<<maxx<<"\n";
}
return 0;
}
C1. Skyscrapers (easy version)(暴力)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5,maxm=1e5+5;
const int mod=1e9+7,inf=0x7f7f7f7f;
int n,a[maxn],res[maxn],b[maxn];
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i];
ll ans=0;
for(int i=1;i<=n;++i)
{
ll sum=0;
b[i]=a[i],sum+=a[i];
for(int j=i-1;j>=1;--j)
b[j]=min(b[j+1],a[j]),sum+=b[j];
for(int j=i+1;j<=n;++j)
b[j]=min(b[j-1],a[j]),sum+=b[j];
if(ans<=sum)
{
ans=sum;
for(int j=1;j<=n;++j)
res[j]=b[j];
}
}
for(int i=1;i<=n;++i)
cout<<res[i]<<" ";
cout<<"\n";
return 0;
}
C2. Skyscrapers (hard version)(单调栈)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=5e5+5,maxm=1e5+5;
const int mod=1e9+7,inf=0x7f7f7f7f;
int n,a[maxn];
int l[maxn],r[maxn];
ll pref[maxn],suff[maxn];
int s[maxn],top;
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i];
top=0;
for(int i=1;i<=n;++i)
{
while(top&&a[s[top]]>=a[i])
top--;
if(top)
l[i]=s[top];
else
l[i]=0;
s[++top]=i;
pref[i]=pref[l[i]]+1ll*(i-l[i])*a[i];
}
top=0;
for(int i=n;i>=1;--i)
{
while(top&&a[s[top]]>=a[i])
top--;
if(top)
r[i]=s[top];
else
r[i]=n+1;
s[++top]=i;
suff[i]=suff[r[i]]+1ll*(r[i]-i)*a[i];
}
int pos=1;
ll ans=0;
for(int i=1;i<=n;++i)
if(ans<pref[i]+suff[i]-a[i])
ans=pref[i]+suff[i]-a[i],pos=i;
for(int i=pos-1;i>=1;--i)
a[i]=min(a[i+1],a[i]);
for(int i=pos+1;i<=n;++i)
a[i]=min(a[i-1],a[i]);
for(int i=1;i<=n;++i)
printf("%d%c",a[i],i==n?'\n':' ');
return 0;
}