C题:思路清晰题,有点贪心的感觉。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string.h> using namespace std; int main(){ char s[100005]; while(cin >> s){ int len=strlen(s); int cous=0,coul=0; int minc=100005; for(int i=0;i<len;i++){ if(s[i]>='a' && s[i]<='z') cous++; if(s[i]>='A' && s[i]<='Z') coul++; } minc = cous<coul ? cous:coul; int qs=0,ql=0; for(int i=0;i<len;i++){ if(s[i]>='a' && s[i]<='z') qs++; if(s[i]>='A' && s[i]<='Z') ql++; minc = min(minc,qs+coul-ql); } cout << minc << endl; } return 0; }
F题:思路清晰题,二分法。
#include <iostream> #include <algorithm> using namespace std; int a[100005]; int b[100005]; struct P{ int a,b; }p[100005]; int main() { int n,x; while(cin >> n){ for(int i=1;i<=n;i++){ cin >> x; a[x]=i; } for(int i=1;i<=n;i++){ cin >> x; b[x]=i; p[i-1].a=i; p[i-1].b=x; } for(int i=1;i<=n;i++){ int key=a[i]; int l=0,r=n,mid; while(l<r){ mid=(l+r)/2; if(p[mid].a==key){ if(i!=n) cout << p[mid].b <<" "; else cout << p[mid].b <<endl; break; } else if(p[mid].a>key) r=mid; else l=mid; } } } return 0; }
要习惯用二分法解决问题:
int main(){ int a[50]; int n,key; while(cin >> n >> key){ for(int i=0;i<n;i++) cin >> a[i]; int l=0,r=n,mid; while(l<r){ mid=(l+r)/2; if(a[mid]==key){ cout << mid <<endl; break; } else if(a[mid]>key) r=mid; else l=mid; } } return 0; }