浙大複試上機題目解答(3)

題目要求:

給定一系列2維平面點的座標(x, y),其中xy均爲整數,要求用一個最小的長方形框將所有點框在內。長方形框的邊分別平行於xy座標軸,點落在邊上也算是被框在內。 

 

具體的輸入輸出格式規定如下:

 

輸入格式:測試輸入包含若干測試用例,每個測試用例由一系列座標組成,每對座標佔一行,其中|x||y|小於 231;一對0 座標標誌着一個測試用例的結束。注意(0, 0)不作爲任何一個測試用例裏面的點。一個沒有點的測試用例標誌着整個輸入的結束。 

 

輸出格式:對每個測試用例,在1行內輸出2對整數,其間用一個空格隔開。第1對整數是長方形框左下角的座標,第2對整數是長方形框右上角的座標。

 

輸入樣例:

 

12 56

23 56

13 10

0 0

12 34

0 0

0 0

 

輸出樣例:

 

12 10 23 56

12 34 12 34

#include <iostream>
using namespace std;
bool Input()
{
    
int x,y;
    
int minx,miny,maxx,maxy;
    cin
>>x>>y;
    
if(!x&&!y)  return false;
     minx
=maxx=x;
     miny
=maxy=y;
    
while(1)
    
{
      cin
>>x>>y;
      
if(!x&&!y) break;
      
if(x<minx) minx=x;
      
if(x>maxx) maxx=x;
      
if(y<miny) miny=y;
      
if(y>maxy) maxy=y;  
     }

    cout
<<minx<<" "<<miny<<" "<<maxx<<" "<<maxy<<endl;
    
return true;    
}

int main()
{
    
  
while(Input());    
    
return 0;
}

題目要求:

統計一個給定字符串中指定的字符出現的次數

 

具體的輸入輸出格式規定如下:

 

輸入格式:測試輸入包含若干測試用例,每個測試用例包含2行,第1行爲一個長度不超過5的字符串,第2行爲一個長度不超過80的字符串。注意這裏的字符串包含空格,即空格也可能是要求被統計的字符之一。當讀到'#'時輸入結束,相應的結果不要輸出。

 

輸出格式:對每個測試用例,統計第1行中字符串的每個字符在第2行字符串中出現的次數,按如下格式輸出:

 

c0 n0

c1 n1

c2 n2

...

 

其中ci是第1行中第i個字符,nici出現的次數。

 

輸入樣例:

 

I

THIS IS A TEST

i ng

this is a long test string

#

 

輸出樣例:

 

I 2

i 3

  5

n 2

g 2

 

 

題目要求:

 

現有公園遊船租賃處請你編寫一個租船管理系統。當遊客租船時,管理員輸入船號並按下S鍵,系統開始計時;當遊客還船時,管理員輸入船號並按下E鍵,系統結束計時。船號爲不超過100的正整數。當管理員將0作爲船號輸入時,表示一天租船工作結束,系統應輸出當天的遊客租船次數和

平均租船時間。

注意:由於線路偶爾會有故障,可能出現不完整的紀錄,即只有租船沒有還船,或者只有還船沒有租船的紀錄,系統應能自動忽略這種無效紀錄。

具體的輸入輸出格式規定如下:

 

輸入格式:測試輸入包含若干測試用例,每個測試用例爲一整天的租船紀錄,格式爲

 

 

船號(1~100 鍵值(SE 發生時間(小時:分鐘)

 

 

每一天的紀錄保證按時間遞增的順序給出。當讀到船號爲-1時,全部輸入結束,相應的結果不要輸出。

輸出格式:對每個測試用例輸出1行,即當天的遊客租船次數和平均租船時間(以分鐘爲單位的精確到個位的整數時間)。

 

輸入樣例:

 

1 S 08:10

2 S 08:35

1 E 10:00

2 E 13:16

0 S 17:00

0 S 17:00

3 E 08:10

1 S 08:20

2 S 09:00

1 E 09:20

0 E 17:00

-1

 

輸出樣例:

 

2 196

0 0

1 60

#include <iostream>
#include 
<string>
#include 
<cstring>
#include 
<vector>
using namespace std;
int flag[128];
int start[128];
vector 
<int> vec;
int strToint(string str)
{
    
int hour;
    
int minute;
    hour
=(str[0]-'0')*10+str[1]-'0';
    minute
=(str[3]-'0')*10+str[4]-'0';
    
return hour*60+minute;
}

bool Input()
{
  
int num;
  
char key;
  
string time;
  cin
>>num;
  
if(num==-1)return false;  
  cin
>>key>>time;  
  memset(flag,
0,sizeof(flag));
  vec.clear();
  
if(!num)  return true;
  
if(key=='S')
    
{
        flag[num]
=1;
        start[num]
=strToint(time);
     }

  
while(cin>>num>>key>>time)
  
{
        
if(!num) break;
         
if(key=='S')
          
{
             flag[num]
=1;
             start[num]
=strToint(time);   
          }
else if(key=='E')
          
{
                
if(flag[num]==1)
                    
{
                        flag[num]
=0;
                        vec.push_back(strToint(time)
-start[num]);
                    }
                
            }
      
        
  }

  
return true;
}

void Solve()
{
    
int sum=0;
    
int len=vec.size();
    
int i;
    
for(i=0;i<len;i++)
     sum
+=vec[i];
     
if(len)
     cout
<<len<<" "<<(sum+len-1)/len<<endl;
     
else 
     cout
<<0<<" "<<0<<endl;
}

int main()
{
    
while(Input())
     Solve();
    
    
return 0;
    
}

題目要求:

Excel可以對一組紀錄按任意指定列排序。現請你編寫程序實現類似功能。

具體的輸入輸出格式規定如下:

 

輸入格式:測試輸入包含若干測試用例。每個測試用例的第1行包含兩個整數 N (<=100000) C,其中 N 是紀錄的條數,C 是指定排序的列號。以下有 N

行,每行包含一條學生紀錄。每條學生紀錄由學號(6位數字,同組測試中沒有重複的學號)、姓名(不超過8位且不包含空格的字符串)、成績(閉區間[0, 100]內的整數)組成,每個項目間用1個空格隔開。當讀到 N=0 時,全部輸入結束,相應的結果不要輸出。

 

輸出格式:對每個測試用例,首先輸出1“Case i:”,其中 i 是測試用例的編號(從1開始)。隨後在 N 行中輸出按要求排序後的結果,即:當 C=1 時,按學號遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3

時,按成績的非遞減排序。當若干學生具有相同姓名或者相同成績時,則按他們的學號遞增排序。

 

輸入樣例:

 

3 1

000007 James 85

000010 Amy 90

000001 Zoe 60

4 2

000007 James 85

000010 Amy 90

000001 Zoe 60

000002 James 98

4 3

000007 James 85

000010 Amy 90

000001 Zoe 60

000002 James 90

0 0

 

輸出樣例:

 

Case 1:

000001 Zoe 60

000007 James 85

000010 Amy 90

Case 2:

000010 Amy 90

000002 James 98

000007 James 85

000001 Zoe 60

Case 3:

000001 Zoe 60

000007 James 85

000002 James 90

000010 Amy 90

#include <iostream>
#include 
<cstring>
#include 
<algorithm>
using namespace std;
int flag;
class student
{
   
public:
        
char ID[8];
        
char name[16];
        
int grade;
        
bool operator<(student &B)
        
{
          
if(flag==1)
            
return strcmp(ID,B.ID)<0?true:false
           
else if(flag==2)
            
return strcmp(name,B.name)<0?true:false
            
else 
             
{
                    
if(grade!=B.grade)
                     
return grade<B.grade;
                     
else return strcmp(ID,B.ID)<0?true:false;
              }

        }
    
}
;
student stu[
100005];
bool Input()
{
  
int n;
  cin
>>n>>flag;
  
if(!n&&!flag) return false;
  
int i;
  
for(i=0;i<n;i++)
   
{
        cin
>>stu[i].ID>>stu[i].name>>stu[i].grade;
    }

    sort(stu,stu
+n);
   cout
<<"Case "<<flag<<":"<<endl;
   
for(i=0;i<n;i++)
    cout
<<stu[i].ID<<" "<<stu[i].name<<" "<<stu[i].grade<<endl;  
   
return true;
}

int main()
{
    
while(Input());
return 0;
}

題目要求:

省政府暢通工程的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可)。經過調查評估,得到的統計表中列出了有可能建設公路的若干條道路的成本。現請你編寫程序,計算出全省暢通需要的最低成本。

具體的輸入輸出格式規定如下:

 

輸入格式:測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 N、村莊數目M ( < 100 );隨後的 N

行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本(也是正整數)。爲簡單起見,村莊從1M編號。當N0時,全部輸入結束,相應的結果不要輸出。

 

輸出格式:對每個測試用例,在1行裏輸出全省暢通需要的最低成本。若統計數據不足以保證暢通,則輸出“?”

 

輸入樣例:

 

3 3

1 2 1

1 3 2

2 3 4

1 3

2 3 2

0 100

 

輸出樣例:

 

3

?

#include <iostream>
#include 
<cstring>
using namespace std;
int matrix[128][128];
int flag[128];
int nearest[128];
int n,m,p;
void Init()
{
      memset(flag,
0,sizeof(flag));
      memset(nearest,
0,sizeof(nearest));
      
int i,j;
      
for(i=0;i<=m;i++)
        
for(j=0;j<=m;j++)
          matrix[i][j]
=1000000000;
}

bool Input()
{
    cin
>>n>>m;
    
if(!n) return false;
    
int i;
    
int head,rear,v,min=1000000009;
    Init();
    
for(i=0;i<n;i++)
    
{
        cin
>>head>>rear>>v;
        
if(v<min) {min=v;p=head;}
        matrix[head][rear]
=matrix[rear][head]=v;
    }

}

int findmin()
{
  
int i,min=1000000010,k; 
  
for(i=1;i<=m;i++)
   
if(!flag[i])
   
{
      
if(nearest[i]<min) 
      
{
            min
=nearest[i];k=i;
      }
    
    }
   
  
return k;
}

void Solve()
{
    flag[p]
=1;
    
int i,j;
    
int sum=0;
    
for(i=1;i<=m;i++)
     nearest[i]
=matrix[p][i];
    
for(i=2;i<=m;i++)
     
{
        p
=findmin();
        flag[p]
=1;
        sum
+=nearest[p];
        
for(j=1;j<=m;j++)
         
if(matrix[p][j]<nearest[j])
           nearest[j]
=matrix[p][j];       
     }
 
     
if(sum>1000000000)
      cout
<<"?"<<endl;
      
else
       cout
<<sum<<endl;
}

int main()
{
    
while(Input())
    Solve();
    
return 0;
}

題目要求:

現有一筆經費可以報銷一定額度的發票。允許報銷的發票類型包括買圖書(A類)、文具(B類)、差旅(C類),要求每張發票的總額不得超過1000元,每張發票上,單項物品的價值不得超過600元。現請你編寫程序,在給出的一堆發票中找出可以報銷的、不超過給定額度的最大報銷額。

具體的輸入輸出格式規定如下:

 

輸入格式:測試輸入包含若干測試用例。每個測試用例的第1行包含兩個正數 Q N,其中 Q 是給定的報銷額度,N<=30)是發票張數。隨後是 N 行輸入,每行的格式爲:

 

m Type_1:price_1 Type_2:price_2 ... Type_m:price_m

 

其中正整數 m 是這張發票上所開物品的件數,Type_i price_i 是第 i 項物品的種類和價值。物品種類用一個大寫英文字母表示。當N0時,全部輸入結束,相應的結果不要輸出。

輸出格式:對每個測試用例輸出1行,即可以報銷的最大數額,精確到小數點後2位。

 

輸入樣例:

 

200.00 3

2 A:23.50 B:100.00

1 C:650.00

3 A:59.99 A:120.00 X:10.00

1200.00 2

2 B:600.00 A:400.00

1 C:200.50

1200.50 3

2 B:600.00 A:400.00

1 C:200.50

1 A:100.00

100.00 0

 

輸出樣例:

 

123.50

1000.00

1200.50

#include <iostream>
#include 
<vector>
using namespace std;
vector 
<double> vec;
double top;
bool Input()
{
   
int num;
   cin
>>top>>num;
   
if(!num) return false;
   vec.clear();
   vec.push_back(
0);
   
int i,k,j;
   
double sum,mon;
   
char ch1,ch2;
   
for(i=0;i<num;i++)
   
{
        sum
=0;
        cin
>>k;
        
for(j=0;j<k;j++)
         
{
           cin
>>ch1>>ch2;
           cin
>>mon;
           
if(mon>600||(ch1!='A'&&ch1!='B'&&ch1!='C')) mon=1001;
           sum
+=mon;
         }

         
if(sum<=1000)
          vec.push_back(sum);
   }

    
return true;   
}

double f(int n,double v)
{
    
if(n==0)return 0;
    
if(v<0.000001)return 0;
    
if(v>=vec[n])
      
return max(f(n-1,v),f(n-1,v-vec[n])+vec[n]);
    
else return f(n-1,v);
}

double max(double a,double b)
{
    
return a>b?a:b;
}

void Solve()
{
 
int i;
 
int n=vec.size()-1;
 
double v=top; 
   cout.precision(
2);cout.setf(ios::fixed);
  
if(v>=vec[n])
    cout
<<max(f(n-1,v),f(n-1,v-vec[n])+vec[n])<<endl;
  
else cout<<f(n-1,v)<<endl; 
}

int main()
{
    
while(Input())
    Solve();
    
return 0;
}

今天又找到了些題目一起貼上來
#include <iostream>
#include 
<string>
using namespace std;
int main()
{
    
int i,j,cnt;
    
string str,full;
   
while(getline(cin,str))
    
{
        
if(str=="#"break;
        getline(cin,full);
        cnt
=0;
        
for(i=0;i<str.length();i++)
          
{
                cnt
=0;
                
for(j=0;j<full.length();j++)
                 
if(str[i]==full[j]) cnt++;
                 cout
<<str[i]<<" "<<cnt<<endl;
           }
 
    }
    
    
return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章