北大的上机题目.docx
《北大的上机题目.docx》由会员分享,可在线阅读,更多相关《北大的上机题目.docx(13页珍藏版)》请在冰豆网上搜索。
北大的上机题目
北大2011年的上机题目,后面坠落的蚂蚁考思路,放苹果考整数划分,最短路经典算法的实际应用,repeater考察递归这几道比较难,其它的实现比较简单,很符合北大作为一个理科计算机学校的出题风格。
Pro1:
鸡兔同笼
先解方程,然后根据输入数据输出结果就行了。
1.#include
2.usingnamespacestd;
3.intmain(){
4.intcount,num;
5.
6.cin>>count;
7.while(count--){
8.cin>>num;
9.if(num%2!
=0)cout<<"00"<10.else{
11.cout<<(num/4)+((num%4)/2);
12.cout<<""<13.}
14.}
15.return0;
16.}
Pro2:
谁是你的潜在朋友
统计然后输出
1.#include
2.usingnamespacestd;
3.constintMAXN=210;
4.intmain(){
5.intnr,nb,reader[MAXN],book[MAXN],index;
6.
7.while(cin>>nr>>nb){
8.for(index=1;index<=nb;index++)
9.book[index]=0;
10.for(index=0;index11.cin>>reader[index];
12.book[reader[index]]+=1;
13.}
14.for(index=0;index15.if(book[reader[index]]>1)
16.cout<17.else
18.cout<<"BeiJu"<19.}
20.}
21.return0;
22.}
Pro3:
中位数
排序然后输出
1.#include
2.#include
3.usingnamespacestd;
4.constintMAXN=10010;
5.intmain(){
6.intnum,in[MAXN],index;
7.
8.while(cin>>num&&num!
=0){
9.for(index=0;index10.cin>>in[index];
11.sort(&in[0],&in[num]);
12.if(num%2!
=0)
13.cout<14.else
15.cout<<(in[num/2]+in[num/2-1])/2<16.}
17.return0;
18.}
Pro4:
买房子
推出公式直接计算结果
1.#include
2.#include
3.usingnamespacestd;
4.constintMAXN=10010;
5.intmain(){
6.intn,k,index,sum,count;
7.
8.while(cin>>n>>k){
9.sum=200,count=n;
10.for(index=0;index<20;index++){
11.if(count>=sum){
12.cout<13.break;
14.}
15.count+=n;
16.sum+=(sum*k)/100;
17.}
18.if(index==20)
19.cout<<"Impossible"<20.}
21.return0;
22.}
Pro5:
坠落的蚂蚁
悲剧的WA了几十次,虽然原理掌握了,但是实践起来却很差。
注意两个蚂蚁相遇可以等价直接穿越过去。
1.#include
2.#include
3.#include
4.#include
5.usingnamespacestd;
6.constintMAXN=110;
7.structnode{
8.intpos;
9.intdir;
10.};
11.nodeant[MAXN];
12.boolcmp(nodea,nodeb){
13.if(a.pos14.returnfalse;
15.}
16.intmain(){
17.intn,cnt,i,pos;
18.stackleft;
19.stackright;
20.
21.while(scanf("%d",&n)==1){
22.for(i=0;i23.scanf("%d%d",&ant[i].pos,&ant[i].dir);
24.sort(&ant[0],&ant[n],cmp);
25.for(i=0;i26.if(ant[i].dir==0)break;
27.if(ant[i].dir==1)left.push(ant[i].pos);
28.}
29.for(i=n-1;i>=0;i--){
30.if(ant[i].dir==0)break;
31.if(ant[i].dir==-1)right.push(ant[i].pos);
32.}
33.
34.if(left.size()==right.size())printf("Cannotfall!
\n");
35.elseif(left.size()>right.size()){
36.for(i=0;i37.left.pop();
38.printf("%d\n",100-left.top());
39.}else{
40.for(i=0;i41.right.pop();
42.printf("%d\n",right.top());
43.}
44.while(left.empty()==false)left.pop();
45.while(right.empty()==false)right.pop();
46.}
47.return0;
48.}
Pro6:
放苹果
数的拆分问题,推荐看看整数分拆。
纯粹的数学问题。
1.#include
2.#include
3.usingnamespacestd;
4.intf(intm,intn){
5.if(m<0)return0;
6.if(m==0||n==1)return1;
7.returnf(m,n-1)+f(m-n,n);
8.}
9.intmain(){
10.intnum,m,n;
11.
12.scanf("%d",&num);
13.while(num--){
14.scanf("%d%d",&m,&n);
15.printf("%d\n",f(m,n));
16.}
17.return0;
18.}
Pro7:
Repeater
考察递归的实现。
1.#include
2.#include
3.#defineINF1000000000
4.#defineMAXN3010
5.usingnamespacestd;
6.charmat[MAXN][MAXN];
7.charin[10][10];
8.intn,size,rc;
9.voidpaint(intx,inty,intrc_t,intsize_t){
10.inti,j;
11.if(rc_t==1){
12.for(i=0;i13.for(j=0;j14.mat[x+i][y+j]=in[i][j];
15.}
16.return;
17.}else{
18.for(i=0;i19.for(j=0;j20.if(in[i][j]!
='')
21.paint(x+i*size_t/n,y+j*size_t/n,rc_t-1,size_t/n);
22.}
23.}
24.intmain(){
25.inti,j;
26.charch;
27.while(scanf("%d",&n)==1&&n!
=0){
28.ch=getchar();
29.for(i=0;i30.for(j=0;j31.in[i][j]=getchar();
32.ch=getchar();
33.}
34.scanf("%d",&rc);
35.for(i=0,size=1;i36.size=size*n;
37.for(i=0;i38.for(j=0;j39.mat[i][j]='';
40.paint(0,0,rc,size);
41.for(i=0;i42.for(j=0;j43.putchar(mat[i][j]);
44.putchar('\n');
45.}
46.}
47.return0;
48.}
Pro8:
IWannaGoHome
最短路,第一次见的询问的类型,处理的时候将连接分属两个party的城市路径取为有向的,属于同一个Party内的城市取为无向的,然后用最短路算法就出来了。
1.#include
2.#defineMAXR10010
3.#defineMAXC610
4.#defineINF1000000000
5.structnode{
6.ints;
7.inte;
8.intw;
9.};
10.intmat[MAXC][MAXC];
11.intn,m,city[MAXC];
12.noderoad[MAXR];
13.voiddijkstra(){
14.intmin,flag,i;
15.intdist[MAXC],visited[MAXC];
16.for(i=0;i<=n;i++){
17.dist[i]=INF;
18.visited[i]=0;
19.}
20.dist[1]=0;
21.while
(1){
22.min=INF,flag=-1;
23.for(i=1;i<=n;i++)
24.if(visited[i]==0&&dist[i]25.min=dist[i];
26.flag=i;
27.}
28.if(flag==-1||flag==2)break;
29.visited[flag]=1;
30.for(i=1;i<=n;i++)
31.if(visited[i]==0&&mat[flag][i]+min32.dist[i]=mat[flag][i]+min;
33.}
34.if(flag==2)printf("%d\n",dist[2]);
35.elseprintf("-1\n");
36.}
37.intmain(){
38.inti,j,flag;
39.while(scanf("%d",&n)==1&&n!
=0){
40.scanf("%d",&m);
41.for(i=0;i42.scanf("%d%d%d",&road[i].s,&road[i].e,&road[i].w);
43.for(i=1;i<=n;i++){
44.scanf("%d",&flag);
45.city[i]=flag;
46.}
47.for(i=0;i<=n;i++)
48.for(j=0;j<=n;j++)
49.mat[i][j]=INF;
50.for(i=0;i51.if(city[road[i].s]==city[road[i].e]){
52.mat[road[i].s][road[i].e]=mat[road[i].e][road[i].s]=road[i].w;
53.}elseif(city[road[i].s]==1&&city[road[i].e]==2)
54.mat[road[i].s][road[i].e]=road[i].w;
55.elsemat[road[i].e][road[i].s]=road[i].w;
56.}
57.dijkstra();
58.}
59.return0;
60.}
------------数学是计算机人的很重要的工具
中位数定义:
一组数据按从小到大的顺序依次排列,处在中间位置的一个数或最中间两个数据的平均值(如果这组数的个数为奇数,则中位数为位于中间位置的那个数;如果这组数的个数为偶数,则中位数是位于中间位置的两个数的平均值).
给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数)
输入
该程序包含多组测试数据,每一组测试数据的第一行为N,代表该组测试数据包含的数据个数,1<=N<=10000.
接着N行为N个数据的输入,N=0时结束输入
输出
输出中位数,每一组测试数据输出一行
样例输入
4
10
30
20
40
3
40
30
50
4
1
2
3
4
0
样例输出
25
40
2
解法是:
[cpp]viewplaincopyprint?
1.#include
2.#include
3.usingnamespacestd;
4.
5.intmain()
6.{
7.
8.intn;cin>>n;
9.while(n!
=0)
10.{
11.int*arr=newint[n];
12.for(inti=0;i13.cin>>arr[i];
14.
15.sort(arr,arr+n);
16.
17.intmid=n>>1;
18.if(n&1==1)
19.cout<20.else
21.cout<<((arr[mid-1]+arr[mid])>>1)<22.
23.cin>>n;
24.}
25.return0;
26.}
某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每年百分之K增长,并且该程序员未来年薪不变,且不吃不喝,不用交税,每年所得N万全都积攒起来,问第几年能够买下这套房子(第一年房价200万,收入N万)
输入
有多行,每行两个整数N(10<=N<=50),K(1<=K<=20)
输出
针对每组数据,如果在第20年或者之前就能买下这套房子,则输出一个整数M,表示最早需要在第M年能买下,否则输出Impossible,输出需要换行
样例输入
5010
4010
408
样例输出
8
Impossible
10
解法为:
[cpp]viewplaincopyprint?
1.#include
2.usingnamespacestd;
3.
4.intmain()
5.{
6.intN,K;
7.while(cin>>N>>K)
8.{
9.floatprice=200;
10.floatearn=N;
11.intyear=1;
12.while(earn13.{
14.if(year>20)
15.{
16.cout<<"Impossible"<17.break;
18.}
19.//cout<<"year:
"<"<20.earn+=N;
21.price=price*(1.0+(float)K/100);
22.year++;
23.}
24.if(year<=20)
25.cout<26.}
27.return0;
28.}