By 虎皮玄椒
418 字
2 分钟
CF600
A. Extract Numbers
字符串模拟。
我的做法是先记录分割的位置,将字符串分割,之后再判断分割出来的字符串属于哪一类,最后输出。唉字符串。。。
#include<bits/stdc++.h>#define endl "\n"#define int long longusing namespace std;signed main(){ std::ios::sync_with_stdio(false);std::cin.tie(0); string s;cin>>s; vector<int> dif; vector<string> vec; for(int i=0;i<s.size();i++) if(s[i]==';'||s[i]==',')dif.push_back(i); for(int i=0;i<dif.size();i++){ if(i==0){ if(dif[i]==0||dif[i]==s.size()-1)vec.push_back(""); else vec.push_back(s.substr(0,dif[i])); continue; } if(dif[i]==dif[i-1]) vec.push_back(""); else vec.push_back(s.substr(dif[i-1]+1,dif[i]-dif[i-1]-1)); } if(dif.size()!=0){ if(dif[dif.size()-1]==s.size()-1)vec.push_back(""); else vec.push_back(s.substr(dif[dif.size()-1]+1,s.size()-dif[dif.size()-1])); } if(dif.size()==0)vec.push_back(s); vector<string> a,b; for(auto it:vec){ if(it.size()==0)b.push_back(it); else if(it[0]=='0'&&it.size()!=1)b.push_back(it); else{ int flag=0; for(int i=0;i<it.size();i++){ if(it[i]<'0'||it[i]>'9'){ b.push_back(it); flag=1; break; } } if(flag==0)a.push_back(it); } } if(a.size()==0)cout<<"-\n"; else{ cout<<"\""; for(int i=0;i<a.size();i++){ if(i==a.size()-1)cout<<a[i]<<"\"\n"; else cout<<a[i]<<','; } } if(b.size()==0)cout<<"-\n"; else{ cout<<"\""; for(int i=0;i<b.size();i++){ if(i==b.size()-1)cout<<b[i]<<"\"\n"; else cout<<b[i]<<','; } } return 0;}B. Queries about less or equal elements
二分查找?不太理解为什么是 B。
signed main(){ int n,m;cin>>n>>m; vector<int> a(n),b(m); for(int i=0;i<n;i++)cin>>a[i]; for(int i=0;i<m;i++)cin>>b[i]; sort(a.begin(),a.end()); for(int i=0;i<m;i++){ cout<<upper_bound(a.begin(),a.end(),b[i])-a.begin()<<' '; } return 0;}C.Make Palindrome
将给定字符串用最少次数更改为回文串,若次数相同则取字典序较小的回文串。
每次操作为修改字符串中的一个字母。允许重新排列,重新排列不计入操作次数。
既然允许重新排列,那就只跟字母的个数有关,有偶数个的字母不用管,只需要不同的奇数个的字母相互转换即可。要字典序最小,则把较大的字母转换为较小的字母。
最后按照字典序将字母排列到两侧,若有剩余的,即个数为奇数,即为中心字母。
signed main(){ string s;cin>>s; int n=s.size(); int flag=1; for(int i=0;i<n/2;i++){ if(s[i]!=s[n-1-i]){ flag=0; break; } } sort(s.begin(),s.end()); vector<int> cnt(26); for(int i=0;i<n;i++)cnt[s[i]-'a']++; vector<char> odds; for(int i=0;i<26;i++){ if(cnt[i]%2)odds.push_back(i+'a'); } while(odds.size()>1){ cnt[*(odds.begin())-'a']++; cnt[*(odds.end()-1)-'a']--; odds.erase(odds.begin()); odds.erase(odds.end()-1); } stringstream ss; for(int i=0;i<26;i++){ while(cnt[i]>=2){ ss<<char(i+'a'); cnt[i]-=2; } } string ans;ss>>ans; string rev(ans); reverse(rev.begin(),rev.end()); for(int i=0;i<26;i++){ if(cnt[i])ans+=(i+'a'); } ans+=rev; cout<<ans<<endl; return 0;}部分信息可能已经过时
