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