Problem - 322B - Codeforces,1481C - Fence Painting,J - ABC Legacy,F - to Pay Res

71 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 30 天,点击查看活动详情

Problem - 322B - Codeforces

有一种情况没有看出来看,不应该,3  5  5的答案应该是4,g和r单独做一个,然后再做上两个mixing的,特判一下这种情况就行:有两个取余为2,另一个取余为0

ll lcm(ll a,ll b){
    return a*b/__gcd(a,b);
}
ll r,g,b;
int main(){
    while(cin>>r>>g>>b){
       // scanf("%lld%lld%lld",&r,&g,&b);
    ll ans=min({r,g,b}),R=r-min({r,g,b}),G=g-min({r,g,b}),B=b-min({r,g,b});
    ans+=R/3+G/3+B/3;
    if(r%3==2&&g%3==2&&b%3==0&&b){
        ans=max(ans,r/3+g/3+b/3+1);
    }
    else if(r%3==2&&b%3==2&&g%3==0&&g){
        ans=max(ans,r/3+g/3+b/3+1);
    }
    else if(g%3==2&&b%3==2&&r%3==0&&r){
        ans=max(ans,r/3+g/3+b/3+1);
    }
    R=r/3,G=g/3,B=b/3;
    r=r%3,g=g%3,b=b%3;
    ll res=R+G+B+min({r,g,b});
    printf("%lld\n",max(res,ans));
    }
    system("pause");
    return 0;
}

1481C - Fence Painting 

如果c[m]是b中需要被修改的数,那么我们就让c[m]=v.back();如果不需要修改但是b中有c[m]那我们就找一个b的坐标作为c[m]的答案;如果b中没有c[m]的数,那么就是-1;

思路和题解差不多,但是细节没处理好,就是第一种情况没有贪心的让c[m]也去分配一个修改数的名额,改了这个之后就过了

CodeForces - 1481C - Fence Painting (贪心)_zzqwtc的博客-CSDN博客

ll lcm(ll a,ll b){
    return a*b/__gcd(a,b);
}
ll t,n,m,a[100005],b[100005],ans[100005],c[100005],vis[100005];
vector<ll>v[100005];
int main(){
    scanf("%lld",&t);
    while(t--){
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);v[i].clear();vis[i]=0;
        }
        for(int i=1;i<=n;i++){
            scanf("%lld",&b[i]);
            if(a[i]!=b[i]) v[b[i]].push_back(i);
            vis[b[i]]=i;
        }
        for(int i=1;i<=m;i++) scanf("%lld",&c[i]);
        ll ma=0,flag=1;
        if(v[c[m]].size()) ma=v[c[m]].back(),v[c[m]].pop_back();
        else if(vis[c[m]]) ma=vis[c[m]];
        if(ma==0){
            printf("NO\n");continue;
        }
        ans[m]=ma;
        for(int i=1;i<m;i++){
            if(v[c[i]].size()){
                ans[i]=v[c[i]].back();
                v[c[i]].pop_back();
            }
            else if(ma) ans[i]=ma;
        } 
        for(int i=1;i<=n;i++){
            if(v[b[i]].size()>0){flag=0;break;}
        }
        if(flag){
            printf("YES\n");
            for(int i=1;i<=m;i++) printf("%lld ",ans[i]);
            printf("\n");
        }
        else printf("NO\n");
    }
    system("pause");
    return 0;
}

J - ABC Legacy

wa麻了,a是左括号,c是右括号,b两者都可以,然后想了几种方法来避免B匹配到B,但是都不可行,最后只能问别人了,让b当作一个特殊的左括号,弄两个栈,而且一定要注意按照遍历的顺序入栈

ll n;
char s[400005];
vector<pair<ll,ll>>g;
stack<ll>sa,sb;
ll f[400005];
int main(){
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    cin>>n;
    cin>>s+1;
    n<<=1;
    ll cnt=0;
    for(int i=1;i<=n;i++){
        if(s[i]=='A') cnt++;
    }
    cnt=n/2-cnt;
    if(cnt<0){
        cout<<"NO\n";
        return 0;
    }
    ll cno=0;
    for(int i=1;i<=n;i++){
        if(s[i]=='A'){
            sa.push(i);
        }
        if(s[i]=='B'){
            if(cnt){
                cnt--;
                sb.push(i);
            }
            else{
                if(sa.empty()){
                    cout<<"NO\n";return 0;
                }
                g.push_back({sa.top(),i});
                sa.pop();
            }
        }
        if(s[i]=='C'){
            if(!sb.empty()){
                g.push_back({sb.top(),i});
                sb.pop();
            }
            else if(!sa.empty()){
                g.push_back({sa.top(),i});
                sa.pop();
            }
            else{cout<<"NO\n";return 0;}
        }
    }
    cout<<"YES\n";
    for(int i=0;i<g.size();i++) cout<<g[i].first<<" "<<g[i].second<<"\n";
    system("pause");
    return 0;
}

F - to Pay Respects 贪心

一开始真是没有想到,越分析情况越多,最后就想着应该可以有一个方法可以全都考虑出来,但是还是没想到,,,

将P可以消掉R的这个操作也看做是伤害,也就是把这个关系给简化成造成了P+R的伤害,然后恢复了R,这样就可以去枚举每一个点使用了P会造成多少伤害,最后只取前K大就可以

2021 ICPC Southeastern Europe Regional Contest ABFGJKLN_HeartFireY的博客-CSDN博客

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define endl '\n'
#define lowbit(i) (i)&(-i)
#define all(x) (x).begin(),(x).end()
#define MOD(x) (((x)%mod+mod)%mod)
using namespace std;
const ll mod=1e9+7;
const double inf=1e18;
const double eps=1e-8;
ll qpow(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
ll lcm(ll a,ll b){
    return a*b/__gcd(a,b);
}
ll n,X,r,p,k;
char s[1000006];
ll a[1000006];
bool cmp(ll a,ll b){
    return a>b;
}
int main(){
   // cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    cin>>n>>X>>r>>p>>k;
    cin>>s+1;
    ll ans=n*X,m=0;
    for(int i=1;i<=n;i++){
        if(s[i]=='1'){
            a[++m]=(n-i+1)*(p+r);
            ans-=(n-i+1)*r;
        }
        else a[++m]=(n-i+1)*p;
    }
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=k&&i<=m;i++){
        ans+=a[i];
    }
    cout<<ans<<"\n";
    system("pause");
    return 0;
}

G - Max Pair Matching 排序

输入时先让所有的a[i]<b[i],然后a[i]一定是被减的,b[i]一定是加的,那么就根据b[2]-a[1]>b[1]-a[2]也就是a[1]+b[1]<a[2]+b[2]来排个序,让后n个b去减前n个a就可以了

2021 ICPC Southeastern Europe Regional Contest ABFGJKLN_HeartFireY的博客-CSDN博客

ll n;
struct node{
    ll a,b;
    bool operator<(const node & o)const{
        return a+b<o.a+o.b;
    }
}c[200005];
int main(){
   // cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n*2;i++){
        cin>>c[i].a>>c[i].b;
        if(c[i].a>c[i].b) swap(c[i].a,c[i].b);
    }
    sort(c+1,c+2*n+1);
    ll ans=0;
    for(int i=1;i<=n;i++) ans-=c[i].a;
    for(int i=n+1;i<=2*n;i++) ans+=c[i].b;
    cout<<ans<<endl;
    system("pause");
    return 0;
}