第五次训练:Educational Codeforces Round 75 (Rated for Div. 2)

1.Educational Codeforces Round 75 (Rated for Div. 2) E1
在这里插入图片描述在这里插入图片描述
  看第七题。
2.Educational Codeforces Round 75 (Rated for Div. 2) C
在这里插入图片描述在这里插入图片描述
题意:给定一个数串,只能交换相邻奇偶数,但交换次数不限。求如果把它看作一个多位数能够得到的最小的值(可以有前导零)。
  奇数间或者偶数间的顺序不变,只看奇偶数怎样穿插,这个看到这个题的时候还真没想到,这样就只要优先输出小的就可以了。

#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const int maxn=3*1e5;
const int mx=(1<<20)+99;
int n,m,maxx,ans,aans,nume,numo,a[maxn+10],b[maxn+10];
string s;
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    for(int o=1;o<=t;o++)
    {
        cin>>s;
        n=s.size();
        nume=numo=0;
        for(int i=0;i<n;i++)
        {
            if((s[i]-'0')%2) a[++numo]=s[i]-'0';
            else b[++nume]=s[i]-'0';
        }
        /*for(int i=1;i<=numo;i++)
        cout<<a[i];
        cout<<endl;
        for(int i=1;i<=nume;i++)
        cout<<b[i];
        cout<<endl;*/
        //cout<<"even:"<<nume<<"\todd:"<<numo<<endl;
        for(int i=1,j=1,k=1;k<=n;k++)
        {
            //cout<<endl<<i<<" "<<j<<" "<<k<<endl;
            if((a[i]<b[j]&&i<=numo&&j<=nume)||j>nume) cout<<a[i++];
            else cout<<b[j++];
        }
        cout<<endl;
    }
    return 0;
}

3.Educational Codeforces Round 75 (Rated for Div. 2) A
在这里插入图片描述
题意:给定一个字符串,其中只能以连续两个(或者偶数个)出现的字母对应键盘可能出故障,而且只要出现奇数个连着的就说明没有故障,输出字符串中没有故障的字母,并以字典序输出。

#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const int maxn=2*1e5;
const int mx=(1<<20)+99;
int n,m,maxx,ans,aans,flag,a[30];
string s;
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    for(int o=1;o<=t;o++)
    {
        memset(a,0,sizeof(a));
        cin>>s;
        n=s.size();
        for(int i=0;i<n;i++)
        {
            if(i==n-1||(i!=n-1&&s[i]!=s[i+1])) a[s[i]-'a']=1;
            else if(i!=n-1&&s[i]==s[i+1]) i++;
        }
        for(int i=0;i<=26;i++)
        {
            if(a[i]) cout<<char(i+'a');
        }
        cout<<endl;
    }
    return 0;
}

4.Educational Codeforces Round 75 (Rated for Div. 2) D
在这里插入图片描述在这里插入图片描述
题意:有s元钱,n个员工。每个人有一个工资范围,用s元钱给工资(不必全给)后,求员工工资的中位数最大能得到多少。

#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const int maxn=2*1e5;
const int mx=(1<<20)+99;
ll m,n;
struct lll
{
    int l,r;
}v[maxn+10];
bool cmp(lll a,lll b)
{
    return a.l<b.l;
}
bool st(ll mid,int n,ll m)
{
    ll ans=n/2+1,ant=0,cost=0;
    for(int a=n-1;a>=0;a--)
    {
        if(v[a].l>=mid)
        {
            cost+=v[a].l;
            ant++;
        }
        else
        {
            if(ant<ans&&v[a].r>=mid)
            {
                cost+=mid;
                ant++;
            }
            else
            {
                cost+=v[a].l;
            }
        }
    }
    if(cost<=m&&ant>=ans)
    {
        return true;
    }
    return false;
}
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    for(int o=1;o<=t;o++)
    {
        cin>>n>>m;
        for(int a=0;a<n;a++)
        {
            cin>>v[a].l>>v[a].r;
        }
        sort(v,v+n,cmp);
        ll l=1,r=m,mid;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(st(mid,n,m))
            {
                l=mid+1;
            }
            else
            {
                r=mid-1;
            }
        }
        cout<<r<<endl;
    }
    return 0;
}

5.Educational Codeforces Round 75 (Rated for Div. 2) F
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
题意:给定k个红木板的长度和n个百木板子的长度,在给出q个周长,用这些木板拼栅栏,每个栅栏有且只有一个红木板和任意个白木板(可以没有),求用这些木板能够拼出每个周长栅栏的种数。
6.Educational Codeforces Round 75 (Rated for Div. 2) B
在这里插入图片描述在这里插入图片描述
题意:给定n个零一串,可以任意调换任意串中的任意数,求能够组成最多的回文串个数。
  做题时想复杂了,其实多种情况合在一起就不会有纰漏了。只看奇数长度的串和所有串的0和1个数即可。

#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const int maxn=2*1e5;
const int mx=(1<<20)+99;
int n,m,maxx,ans,aans,flag,num1,num0;
string s;
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    for(int o=1;o<=t;o++)
    {
        num0=num1=flag=0;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>s;
            int len=s.size();
            if(len%2) flag=1;
            for(int j=0;j<len;j++)
            if(s[j]-'0') num1++; else num0++;
        }
        if(num0%2&&num1%2&&!flag) n--;
        cout<<n<<endl;
    }
    return 0;
}

7.Educational Codeforces Round 75 (Rated for Div. 2) E2
在这里插入图片描述在这里插入图片描述
题意:有n个人投票。对于第i个人如果有其它mi个人投票给你,那么他也会投票给你,不然你就得给他pi的钱才投给你。求怎样花钱少,输出钱数。
  E1,E2区别就在于人数多了三位数,cf上的标签提示了算法,也看了官方题解,但是,即使在理解了人家的算法然后想用自己的程序实现也还是写不ac。不过搜到别人的题解有个E1,E2都通用的,觉得挺好,是用的贪心。

#include<stdio.h>
#include<vector>
#include<queue>
#include<algorithm>
#define it register int
#define il inline 
using namespace std;
const int N=1000005;
int T,n; 
vector<int> g[N];
long long ans;
il void fr(int &num){
    num=0;char c=getchar();int p=1;
    while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
    while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    num*=p;
}
priority_queue<int,vector<int>,greater<int> > q;
int main(){ 
    fr(T);
    while(T--){
        fr(n),ans=0;
        for(it i=1,x,y;i<=n;++i) fr(x),fr(y),g[x].push_back(y);//收买i要x人或者花y元
        for(it i=n-1;i>=0;--i){//注意到一个显而易见的事实就是人数不会超过n
            for(it j=0,sz=g[i].size();j<sz;++j) q.push(g[i][j]);
            while(q.size()>n-i) ans+=q.top(),q.pop();//选前n-i小的人进行收买
        }
        printf("%I64d\n",ans);
        for(it i=0;i<n;++i) g[i].clear();while(!q.empty()) q.pop();//多测不清空 爆零两行泪
    }
    return 0;
}


  总结:做题时做晚了,我记得当时认真听了,不记得老师说可以自己加加数字就可以找到下一次的训练题目,问了很多人没人回我,直到一个多小时后才有人告诉我。。。所以看题也急做题也急,拿题就做也做不好。今天训练效果在我这算是大打折扣了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值