北大的上机题目.docx
- 文档编号:5745842
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:13
- 大小:18.72KB
北大的上机题目.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;index 11.cin>>reader[index]; 12.book[reader[index]]+=1; 13.} 14.for(index=0;index 15.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;index 10.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.pos 14.returnfalse; 15.} 16.intmain(){ 17.intn,cnt,i,pos; 18.stack 19.stack 20. 21.while(scanf("%d",&n)==1){ 22.for(i=0;i 23.scanf("%d%d",&ant[i].pos,&ant[i].dir); 24.sort(&ant[0],&ant[n],cmp); 25.for(i=0;i 26.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;i 37.left.pop(); 38.printf("%d\n",100-left.top()); 39.}else{ 40.for(i=0;i 41.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;i 13.for(j=0;j 14.mat[x+i][y+j]=in[i][j]; 15.} 16.return; 17.}else{ 18.for(i=0;i 19.for(j=0;j 20.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;i 30.for(j=0;j 31.in[i][j]=getchar(); 32.ch=getchar(); 33.} 34.scanf("%d",&rc); 35.for(i=0,size=1;i 36.size=size*n; 37.for(i=0;i 38.for(j=0;j 39.mat[i][j]=''; 40.paint(0,0,rc,size); 41.for(i=0;i 42.for(j=0;j 43.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]+min 32.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;i 42.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;i 51.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;i 13.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(earn 13.{ 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.}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北大 上机 题目