ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #727 (Div. 2)部分题解(A-D)

2021-07-03 13:03:50  阅读:136  来源: 互联网

标签:727 题解 rep nullptr cin Codeforces vis mp ans


(EF给我干蒙了,有时间补吧……

A. Contest Start 题意:有n个人比赛,其中第一个在0开始,第二个在x,第i个在(i-1)*x开始,每个人在t时间后结束比赛,每个人的不满意度是他结束比赛时场上开始比赛且尚未完赛的人数,求总不满意度。 思路:t<x时ans为0,t==x时ans为n-1,t>x时我们可以得出在n足够大的时候,满足让一个人不满意的人应该是一个依次向后的排列(如图)。分类讨论初始长度k与n关系。 代码:
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    cin>>t;
    while(t--)
    {
        ans=0;
        cin>>n>>m>>k;
        if(k<m)ans=0;
        else if(k==m)ans=n-1;
        else
        {
            ll kk=min(n-1,k/m);
            if(kk==n-1)ans=(n*(n-1))/2;
            else
            {
                if(n<kk+1)ans=(n*(n-1))/2;
                else ans=(kk*(kk+1))/2+kk*(n-kk-1);
            }
        }
        cout<<ans<<endl;
    }
}
View Code

(然后发现我想多了,其实思路可以非常简单//XD

B. Love Song 题意:水。 代码:
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    //cin>>t;
    //while(t--)
    {
        a[0]=0;
        cin>>n>>m;
        string s;
        cin>>s;
        rep(i,1,n)
        {
            if(i)a[i]=a[i-1]+s[i-1]-'a'+1;
        }
        rep(i,1,m)
        {
            ll l,r;
            cin>>l>>r;
            ans=a[r]-a[l-1];
            cout<<ans<<endl;
        }
    }
}
View Code

 

C. Stable Groups 题意:给定n个数和k,x两个正整数,现有n个分值为ai的学生,要求排列后相邻两个学生的差的绝对值不大于x,至多能在序列中插入k个任意分值的学生,最少能把原序列加上新的学生后(可不全加或不加)分为几个满足条件的子序列。 思路:我瞎搞的……数据应该比较水,算是个很好想的贪心,找到每个不满足条件的空缺处,找到此处最少需要几个新学生填补,然后升序填进去。 代码:
map<ll,ll>mp;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    cin>>n>>k>>x;
    rep(i,1,n)cin>>a[i];
    sort(a+1,a+1+n);
    rep(i,2,n)
    {
        if(a[i]-a[i-1]>x)
        {
            ll kk=(a[i]-a[i-1]-1)/x;//?
            ans++;
            if(!mp[kk])vis[++tt]=kk;
            mp[kk]++;
        }
    }
    ans++;
    sort(vis+1,vis+tt+1);
    rep(i,1,tt)
    {
        if(k>mp[vis[i]]*vis[i])
        {
            ans-=mp[vis[i]];
            k-=mp[vis[i]]*vis[i];
        }
        else if(k==mp[vis[i]]*vis[i])
        {
            ans-=mp[vis[i]];
            k=0;
            i=tt+1;
        }
        else
        {
            ans-=k/vis[i];
            k=0;
            i=tt+1;
        }
    }
    cout<<ans<<endl;
}
View Code D. PriceFixed 题意:要买n种商品,每种商品要买ai个,每种商品在购买过bi件任意商品后可以打五折,每件商品原价为2,最少需要多少钱。 思路:很明显单纯为了打折而去买多的商品至少需要1+1元,和直接买没区别,那就是直接贪心了。 代码:
bool cmp(node a,node b)
{
    return a.b<b.b;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    cin>>n;
    rep(i,1,n)
    {
        cin>>c[i].a>>c[i].b;
    }
    sort(c+1,c+1+n,cmp);
    ll l=1,r=n;
    while(l<=r)
    {
        if(c[l].b<=cnt)
        {
            ans+=c[l].a;
            cnt+=c[l].a;
            l++;
        }
        else
        {
            ll minn=min(c[r].a,c[l].b-cnt);
            cnt+=minn;
            ans+=2*minn;
            c[r].a-=minn;
            if(c[r].a==0)r--;
        }
    }
    cout<<ans<<endl;
}
View Code /* E. Game with Cards 看着感觉像dp,但搞不出来,结束看有人写的是线段树,有时间再补吧…… */

 

   

标签:727,题解,rep,nullptr,cin,Codeforces,vis,mp,ans
来源: https://www.cnblogs.com/Geospiza/p/14966084.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有