第一題:爭吵問題
有一個隊列,每個人要么朝左邊(L表示),要么朝右邊(R表示),因為每個人都討厭其他任何人,只要兩人面對面就會發生真吵。真吵結果是勝者留在隊列中,敗的人移除隊中。
如果序列中有多對爭吵,可以任選一對,勝者留在隊中,敗者出局,求最后隊列最少人數是多少。
例子:
LRLRLRR
輸出:3
LRR。
思路:這道題找到方法了就很簡單,依據題意 如果要真吵就只有 RL (兩人對面)這種情況 ,其他 LL RR LR 都不會發生真吵。
所以我們只要從左邊向右找到第一個R,從右邊向左找到第一個L。那么這兩人以及之間的人最終只有一個人留下。
程序代碼如下:
#include<iostream> #include<string> int main(){ string str; while(cin>>str){ int n=str.size(); int m=-1,k=-1; for(int i=0;i<n;i++) if(str[i]=='R'){ m=i; break; } for(int i=n-1;i>=0;i--) if(str[i]=='L'){ k=i; break; } if(m==-1||k==-1||k<m) cout<<n<<endl; else cout<<n-(k-m)<<endl; } return 0; }
第二題:球隊問題
有n對球隊進入總決賽,現在要進行淘汰賽,每每兩隊都進行一場比賽,最終前n/2隊進入下一輪淘汰賽。
排名規則:
球隊勝一場得3分,平一場得1分,輸一次得0分。
積分越高排名越前,積分相同,看凈勝球數,越多越靠前,凈勝球數相同,看進球數,進球越多越靠前(例子最終都會排出名次)。
求進入淘汰賽的球隊。
例子:
4
A
B
C
D
A-B 3:1
A-C 2:1
A-D 0:3
B-C 5:6
B-D 1:2
C-D 1:1
輸出:
D
C
程序代碼如下:
#include<iostream> #include<string> #include<map> #include<vector> #include <iomanip> using namespace std; class score{ public: int cnt; //球隊編號 int jifen; //積分 int jinshen; //凈勝球 int jinqiu; //進球數 int fuqiu; // 輸球數 score(){jifen=0;jinshen=0;jinqiu=0;fuqiu=0;cnt=0;} //void getjinshen(){jinshen=jinqiu-fuqiu;} }; int main(){ int n; while(cin>>n){ vector<score> jj(n); map<string,int> a; map<int,string> b; string str; int cnt=0; for(int i=0;i<n;i++){ cin>>str; a.insert(make_pair(str,cnt)); //str 對應 cnt b.insert(make_pair(cnt++,str)); //cnt 對應 str } for(int i=0;i<n;i++) jj[i].cnt=i; getchar(); for(int i=0;i<n*(n-1)/2;i++){ getline(cin,str); int k,k2,k3,m,f; k=str.find('-'); string s1,s2,s3,s4; s1=str.substr(0,k); //球隊1名稱 k2=str.find(' '); s2=str.substr(k+1,k2-k-1); //球隊2名稱 k3=str.find(':'); s3=str.substr(k2+1,k3-k2-1); //球隊1進球數 s4=str.substr(k3+1); //球隊2進球數 m=a[s1]; //球隊1對應的編號 f=a[s2]; //球隊2對應的編號 int i3=0,i4=0; for(int i=0; i<s3.size();i++) { i3=i3*10+s3[i]-'0'; } for(int i=0; i<s4.size();i++) { i4=i4*10+s4[i]-'0'; } jj[m].jinqiu+=i3; //進球數 jj[f].jinqiu+=i4; jj[m].fuqiu+=i4; //輸球數 jj[f].fuqiu+=i3; if(i3==i4){ jj[m].jifen+=1; jj[f].jifen+=1; } if(i3<i4){ jj[f].jifen+=3; }else jj[m].jifen+=3; } for(int i=0;i<n;i++){ jj[i].jinshen=jj[i].jinqiu-jj[i].fuqiu; } cout<<"==============================================================================="<<endl; cout<<setw(16)<<"球隊名"<<setw(8)<<"積分"<<setw(10)<<"凈勝球"<<setw(10)<<"進球數"<<endl; for (int i=0;i<n;i++){ cout<<setw(16)<<b.at(i)<<setw(8)<<jj[i].jifen<<setw(10)<<jj[i].jinshen<<setw(10)<<jj[i].jinqiu<<endl; } cout<<"==============================================================================="<<endl; for(int i=0;i<n-1;i++){ int u=i; for(int j=i+1;j<n;j++){ if(jj[j].jifen>jj[u].jifen) u=j; else if(jj[j].jifen==jj[u].jifen){ if(jj[j].jinshen>jj[u].jinshen) u=j; else if(jj[j].jinqiu>jj[u].jinqiu) u=j; } } score temp; temp=jj[i]; jj[i]=jj[u]; jj[u]=temp; } cout<<"排名后"<<endl; cout<<"==============================================================================="<<endl; cout<<setw(16)<<"球隊名"<<setw(8)<<"積分"<<setw(10)<<"凈勝球"<<setw(10)<<"進球數"<<endl; for (int i=0;i<n;i++){ cout<<setw(16)<<b.at(jj[i].cnt)<<setw(8)<<jj[i].jifen<<setw(10)<<jj[i].jinshen<<setw(10)<<jj[i].jinqiu<<endl; } cout<<"==============================================================================="<<endl; cout<<"前"<<n/2<<"名球隊"<<endl; for(int i=0;i<n/2;i++){ str=b.at(jj[i].cnt); cout<<str<<endl; } } return 0; }