Educational Codeforces Round 2

又是一场cf,依旧三题

第一题和第三题比较有意义。

A 考察对字符串,操作 ‘,’  ‘;’ 作为 分隔符....这题体现string 方便 ,可以直接拼接,以后多使用。

#include<bits/stdc++.h>
using namespace std;
vector<string> a,b;
bool good(string st){
    if(st.size()==0) return false;
    if(st.size()>1&&st[0]=='0') return false;
    for(int i=0;i<st.size();i++)
        if(st[i]>'9'||st[i]<'0') return false;
    return true;
}

void add_string(string st){
   if(good(st)) a.push_back(st);
   else b.push_back(st);
}

int main()
{
   string str,temp="";
   while(getline(cin,str)){
       for(int i=0;i<str.size();i++)
       {
           if(str[i]==','||str[i]==';'){
              add_string(temp);
              temp="";
           }
           else temp+=str[i];
       }
       add_string(temp);
       if(a.size()==0) cout<<"-"<<endl;
       else
       {
           cout<<"\"";
           for(int i=0;i<a.size();i++)
           {
               if(i) cout<<",";
               cout<<a[i];
           }
            cout<<"\""<<endl;
       }
       if(b.size()==0) cout<<"-"<<endl;
       else
       {
           cout<<"\"";
           for(int i=0;i<b.size();i++)
           {
               if(i) cout<<",";
               cout<<b[i];
           }
            cout<<"\""<<endl;
       }
   }
}

B.

熟悉STL upper_bound ,(第一个大于) lower_bound(第一个大于等于)。

#include<bits/stdc++.h>
using namespace std;
int a[2*100010],b[2*100010];
int main()
{
    int n,m;
    while(cin>>n>>m){
        for(int i=0;i<n;i++) cin>>a[i];
        for(int i=0;i<m;i++) cin>>b[i];
        sort(a,a+n);
        for(int i=0;i<m-1;i++)
        {
            cout<<upper_bound(a,a+n,b[i])-a<<" ";
        }
        cout<<upper_bound(a,a+n,b[m-1])-a<<endl;
    }
}

C.给一个字符串比如aabc 问最少修改字母次数,位置可以交换不算次数,输出字符序列最小的回文串,abba 用的是贪心...当时并没有写出来,以为要动规搜索,数据范围 不现实 后来想到贪心 ,借用vector<>保存一些中间值 很方便。
#include<bits/stdc++.h>
using namespace std;
int a[26];
vector<int>v;
int main()
{
    string s;
    while(cin>>s){
        memset(a,0,sizeof(a));
        int len=s.size(),cnt=0;
        for(int i=0;i<len;i++) a[s[i]-'a']++;
        for(int i=0;i<26;i++){
            if(a[i]%2){
                    cnt++;
                    v.push_back(i);
            }
        }
        if(cnt%2==0){
            int t=cnt/2;
            for(int i=0;i<t;i++) a[v[i]]++;
            for(int i=t;i<cnt;i++) a[v[i]]--;
        }
        else{
            int t=cnt/2+1;
            for(int i=0;i<t-1;i++) a[v[i]]++;
            for(int i=t;i<cnt;i++) a[v[i]]--;
        }
        int flag=-1;
        for(int i=0;i<26;i++){
             if(a[i]%2) flag=i;
             for(int j=0;j<a[i]/2;j++)
                   putchar('a'+i);
            }
        if(flag!=-1)    putchar('a'+flag);
        for(int i=25;i>=0;i--){
            for(int j=0;j<a[i]/2;j++)
               putchar('a'+i);
        }
        cout<<endl;
        }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值