Educational Codeforces Round 2

来源:互联网 发布:c 数组最大长度 编辑:程序博客网 时间:2024/05/23 19:19

又是一场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;        }}


0 0