浙大计算机研究生复试上机考试-2010年 .

 题目一:
  1. /************************************************************************/  
  2. /* A+B 
  3.  
  4. Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) 
  5. Total Submission(s): 604    Accepted Submission(s): 380 
  6.  
  7.  
  8. Problem Description 
  9. 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。 
  10. 现在请计算A+B的结果,并以正常形式输出。 
  11.  
  12.  
  13. Input 
  14. 输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。 
  15.  
  16.  
  17. Output 
  18. 请计算A+B的结果,并以正常形式输出,每组数据占一行。 
  19.  
  20.  
  21. Sample Input 
  22. -234,567,890 123,456,789 
  23. 1,234 2,345,678 
  24.  
  25.  
  26. Sample Output 
  27. -111111101 
  28. 2346912 
  29.  
  30.  
  31. Source 
  32. 浙大计算机研究生复试上机考试-2010年 
  33. */  
  34. /************************************************************************/  
  35.   
  36.   
  37.   
  38. #include"iostream"   
  39. #include "string.h"   
  40. #include "math.h"   
  41. using namespace std;  
  42.   
  43. int trans(char *input)  
  44. {  
  45.     //printf("%s",input);   
  46.     int res=0;  
  47.     int i,j;  
  48.     for (i=0;i<strlen(input);i++)  
  49.     {  
  50.         if(input[i]>='0'&&input[i]<='9')  
  51.         {  
  52.             res*=10;  
  53.             res+=(input[i]-'0');  
  54.         }  
  55.     }  
  56.     if(input[0]=='-')  
  57.         res=-res;  
  58.     return res;  
  59. }  
  60.   
  61. int main()  
  62. {  
  63.     char *inp1,*inp2;  
  64.     inp1=(char*)malloc(15*sizeof(char));  
  65.     inp2=(char*)malloc(15*sizeof(char));  
  66.     while(scanf("%s",inp1)!=EOF)  
  67.     {  
  68.         scanf("%s",inp2);  
  69.   
  70.         int a=trans(inp1);  
  71.         int b=trans(inp2);  
  72.         printf("%d\n",a+b);  
  73.     }  
  74. }  

题目二:ZOJ问题 

  1. /************************************************************************/  
  2. /*                                   ZOJ问题 
  3.  
  4. Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) 
  5. Total Submission(s): 657    Accepted Submission(s): 201 
  6.  
  7.  
  8. Problem Description 
  9. 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。 
  10.  
  11. 是否AC的规则如下: 
  12. 1. zoj能AC; 
  13. 2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空; 
  14. 3. 若azbjc 能AC,则azbojac也能AC,其中a,b,c为N个'o'或者为空; 
  15.  
  16.  
  17. Input 
  18. 输入包含多组测试用例,每行有一个只包含'z','o','j'三种字符的字符串,字符串长度小于等于1000; 
  19.  
  20.  
  21. Output 
  22. 对于给定的字符串,如果能AC则请输出字符串“Accepted”,否则请输出“Wrong Answer”。 
  23.  
  24.  
  25. Sample Input 
  26. zoj 
  27. ozojo 
  28. ozoojoo 
  29. oozoojoooo 
  30. zooj 
  31. ozojo 
  32. oooozojo 
  33. zojoooo 
  34.  
  35.  
  36. Sample Output 
  37. Accepted 
  38. Accepted 
  39. Accepted 
  40. Accepted 
  41. Accepted 
  42. Accepted 
  43. Wrong Answer 
  44. Wrong Answer 
  45.  
  46.  
  47. Source 
  48. 浙大计算机研究生复试上机考试-2010年 
  49.  
  50.                                    */  
  51. /************************************************************************/  
  52. /*analyse: 
  53. Accept情况:(x----n个o,n>=1) 
  54. 1. xzojx 
  55. 2. (x)z(o*n)j(x*n) 
  56. */  
  57.   
  58.   
  59. #include "iostream"   
  60. #include "string"   
  61. using namespace std;  
  62.   
  63. int main()  
  64. {  
  65.     char* inp;  
  66.     int o1,o2,o3,z,j,i;  
  67.     int flagz,flagj,flag;  
  68.     inp=(char*)malloc(1020*sizeof(char));  
  69.     while(gets(inp))  
  70.     {  
  71.         flagz=flagj=flag=0;  
  72.         for(i=0;i<strlen(inp);i++)  
  73.         {  
  74.             if(inp[i]=='z')  
  75.                 flagz++,z=i;  
  76.             else if(inp[i]=='j')  
  77.                 flagj++,j=i;  
  78.             else if(inp[i]!='o')  
  79.                 flag=2;  
  80.         }  
  81.         if(flagz!=1||flagj!=1||flag!=0)  
  82.         {  
  83.             puts("Wrong Answer");  
  84.             continue;  
  85.         }  
  86.         o1=z;  
  87.         o2=j-z-1;  
  88.         o3=strlen(inp)-j-1;  
  89.         if(o1*o2==o3&&o2>=1)  
  90.             puts("Accepted");  
  91.         else  
  92.             puts("Wrong Answer");         
  93.     }  
  94. }  

题目三:奥运排序问题 

  1. /************************************************************************/  
  2. /* 奥运排序问题 
  3.  
  4. Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) 
  5. Total Submission(s): 690    Accepted Submission(s): 167 
  6.  
  7.  
  8. Problem Description 
  9. 按要求,给国家进行排名。 
  10.  
  11.  
  12. Input 
  13. 有多组数据。 
  14. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。 
  15. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。 
  16. 接下来一行给出M个国家号。 
  17.  
  18.  
  19. Output 
  20. 排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例  
  21. 对每个国家给出最佳排名排名方式 和 最终排名 
  22. 格式为: 排名:排名方式 
  23. 如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例  
  24. 如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4. 
  25. 每组数据后加一个空行。 
  26.  
  27.  
  28. Sample Input 
  29. 4 4 
  30. 4 8 1 
  31. 6 6 2 
  32. 4 8 2 
  33. 2 12 4 
  34. 0 1 2 3 
  35. 4 2 
  36. 8 10 1 
  37. 8 11 2 
  38. 8 12 3 
  39. 8 13 4 
  40. 0 3 
  41.  
  42.  
  43. Sample Output 
  44. 1:3 
  45. 1:1 
  46. 2:1 
  47. 1:2 
  48.  
  49. 1:1 
  50. 1:1 
  51.  
  52.  
  53. Source 
  54. 浙大计算机研究生复试上机考试-2010年 
  55.                                                                      */  
  56. /************************************************************************/  
  57.   
  58.   
  59. #include "iostream"   
  60. using namespace std;  
  61.   
  62. struct Nation  
  63. {  
  64.     int jin;  
  65.     int jiang;  
  66.     int people;  
  67.     int index;  
  68.     int num[6];//num[0,1,2,3]record sort res,num[4]record min sort num, num[5] record min sort mode   
  69. };  
  70.   
  71. int mode;  
  72. int comp(const void *A,const void* B)  
  73. {  
  74.     struct Nation* a=(Nation*)A;  
  75.     struct Nation* b=(Nation*)B;  
  76.   
  77.     switch(mode)  
  78.     {  
  79.     case 1:      
  80.         return b->jin-a->jin;  
  81.     case 2:  
  82.         return b->jiang-a->jiang;  
  83.     case 3:  
  84.         return b->jin*a->people-a->jin*b->people;  
  85.     case 4:  
  86.         return b->jiang*a->people-a->jiang*b->people;  
  87.     }  
  88. }  
  89.   
  90. bool Same(Nation a,Nation b,int mode)  
  91. {  
  92.     switch(mode)  
  93.     {  
  94.     case 1:  
  95.         return a.jin==b.jin;  
  96.     case 2:  
  97.         return a.jiang==b.jiang;  
  98.     case 3:  
  99.         return a.jin*b.people==b.jin*a.people;  
  100.     case 4:  
  101.         return a.jiang*b.people==b.jiang*a.people;  
  102.     }  
  103. }  
  104.   
  105. int main()  
  106. {  
  107.     int n,m;  
  108.     while(scanf("%d%d",&n,&m)!=EOF)  
  109.     {  
  110.         int i,j,k=0,t;  
  111.         Nation* country=(Nation*)malloc(n*sizeof(Nation));  
  112.         Nation* c=(Nation*)malloc((m+10)*sizeof(Nation));  
  113.         Nation* res=(Nation*)malloc((m+10)*sizeof(Nation));  
  114.         for (i=0;i<n;i++)  
  115.         {  
  116.             scanf("%d%d%d",&country[i].jin,&country[i].jiang,&country[i].people);  
  117.         }  
  118.         for (i=0;i<m;i++)  
  119.         {  
  120.             scanf("%d",&t);  
  121.             c[k]=country[t];  
  122.             for(j=0;j<5;j++)  
  123.                 c[k].num[j]=m+1;  
  124.             c[k++].index=i;  
  125.         }  
  126.         for (mode=4;mode>=1;mode--)  
  127.         {  
  128.             qsort(c,k,sizeof(c[0]),comp);  
  129.             c[0].num[mode-1]=1;  
  130.             for(i=1;i<k;i++)  
  131.                 c[i].num[mode-1]=Same(c[i],c[i-1],mode)?c[i-1].num[mode-1]:(i+1);  
  132.         }  
  133.         for (i=0;i<k;i++)  
  134.         {  
  135.             for (mode=4;mode>0;mode--)  
  136.             {  
  137.                 if (c[i].num[mode-1]<=c[i].num[4])  
  138.                 {  
  139.                     c[i].num[4]=c[i].num[mode-1];  
  140.                     c[i].num[5]=mode;  
  141.                 }  
  142.             }  
  143.             res[c[i].index]=c[i];  
  144.         }  
  145.         for(i=0;i<m;i++)  
  146.             printf("%d:%d\n",res[i].num[4],res[i].num[5]);  
  147.         cout<<endl;  
  148.     }  
  149. }  

题目四:最短路径问题 

/************************************************************************/
/* 最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2114    Accepted Submission(s): 659


Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。


Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)


Output
输出 一行有两个数, 最短距离及其花费。


Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0


Sample Output
9 11


Source
浙大计算机研究生复试上机考试-2010年
                                                                     */
/************************************************************************/

//这个是SPFA法,Dijkstra法见下个代码
#include"iostream"
#include"queue"
#include"vector"
using namespace std;

#define N 1005
#define INF 100000000
int n,m;

struct MAP
{
 int node;
 int dis;
 int cost;
 MAP(int a,int d,int p)
 {
  node=a,dis=d,cost=p;
 }
};
vector<MAP>map[N];//map[i][j]表与节点i相连的第j条边的信息
int minres[N][2];//min_dis/cost from s to i

void spfa(int s,int e)
{
 queue<int>Q;
 bool used[N]={false};
 Q.push(s);
 used[s]=true;
 int i;
 for(i=1;i<=n;i++)
  minres[i][0]=minres[i][1]=INF;
 minres[s][0]=minres[s][1]=0;
 while(!Q.empty())
 {
  int now=Q.front();
  Q.pop();
  used[now]=false;//
  for(i=0;i<map[now].size();i++)
  {
   int tmpend=map[now][i].node;
   int dis=map[now][i].dis;
   int cost=map[now][i].cost;

   if(minres[tmpend][0]>minres[now][0]+dis||
    (minres[tmpend][0]==minres[now][0]+dis&&
    minres[tmpend][1]>minres[now][1]+cost))
   {
    minres[tmpend][0]=minres[now][0]+dis;
    minres[tmpend][1]=minres[now][1]+cost;
    if(!used[tmpend])
     Q.push(tmpend);
    used[tmpend]=true;
   }
  }
 }
}

int main()
{
 while(scanf("%d %d",&n,&m)!=EOF&&!(m==0&&n==0))
 {
  int a,b,d,p,i,j;
  for (i=1;i<=n;i++)
   map[i].clear();
  while (m--)
  {
   scanf("%d%d%d%d",&a,&b,&d,&p);
   map[a].push_back(MAP(b,d,p));//注意双向边
   map[b].push_back(MAP(a,d,p));
  }
  scanf("%d%d",&a,&b);
  spfa(a,b);
  printf("%d %d\n",minres[b][0],minres[b][1]);
 }
}

法二 Dijkstra

#include"iostream"
#include"vector"
using namespace std;
#define N 1005
#define INF 1000000000
int n,m;

struct Map
{
 int point;//another point of edges connect this point
 int dis;
 int cost;
 Map(int x,int y,int z):point(x),dis(y),cost(z){}
};
vector<Map>map[N];
int minres[N][2];

void bfs(int s,int e)
{
 int i,j;
 for(i=1;i<=n;i++)
  minres[i][0]=minres[i][1]=INF;
 minres[s][0]=minres[s][1]=0;

 bool used[N]={false};//false--in the end point set
 
 for(j=0;j<n;j++)//n loops
 {
  int mindis,mincost,tmp;
  mindis=mincost=INF;
  for(i=1;i<=n;i++)//find a point with min dis and min cost
  {
   if(!used[i]&&(minres[i][0]<mindis||minres[i][0]==mindis&&minres[i][1]<mincost))
   {
    mindis=minres[i][0];
    mincost=minres[i][1];
    tmp=i;
   }
  }
  int p1,d1,c1;
  //update paths connect to point tmp

  for (i=0;i<map[tmp].size();i++)
  {
   p1=map[tmp][i].point;
   d1=map[tmp][i].dis;
   c1=map[tmp][i].cost;
   if((minres[p1][0]>minres[tmp][0]+d1||
    minres[p1][0]==minres[tmp][0]+d1&&minres[p1][1]>minres[tmp][1]+c1)&&
    !used[p1])
   {
    minres[p1][0]=minres[tmp][0]+d1;
    minres[p1][1]=minres[tmp][1]+c1;
   }
  } 
  used[tmp]=true;
 }
}


int main()
{
 while(scanf("%d%d",&n,&m)!=EOF&&!(m==0&&n==0))
 {
  int a,b,d,p;
  for (int i=1;i<=n;i++)
   map[i].clear();///////////千万注意!
  while(m--)
  {
   scanf("%d%d%d%d",&a,&b,&d,&p);
   map[a].push_back(Map(b,d,p));
   map[b].push_back(Map(a,d,p));
  }
  scanf("%d%d",&a,&b);
  bfs(a,b);
  printf("%d %d\n",minres[b][0],minres[b][1]);
 }
}

 

。。。

/************************************************************************/
/*
@Function: Min Path
@Method: Dijikstra+Priority_Queue                                                       
@Author: zrq sophia
*/
/************************************************************************/
#include"iostream"
#include"vector"
#include "queue"
using namespace std;
#define N 1005
#define INF 1000000000
int n,m;

struct Map
{
 int point;//another point of edges connect this point
 int dis;
 int cost;
 Map(int x,int y,int z):point(x),dis(y),cost(z){}
};
vector<Map>map[N];
int minres[N][2];

struct WAY
{
 int dis;
 int cost;
 int point;
 bool operator < (const WAY a)const
 {
  if(a.dis==dis)
   return a.cost<cost;//sort from small to big
  return a.dis<dis;
 }
};

void bfs(int s,int e)
{
 int i,j;
 for(i=1;i<=n;i++)
  minres[i][0]=minres[i][1]=INF;
 minres[s][0]=minres[s][1]=0;
 priority_queue<WAY>Q;
 WAY now,temp;
 now.point=s;
 now.dis=now.cost=0;
 Q.push(now);

 bool used[N]={false};//false--in the end point set
 int tmp;
 while(!Q.empty())
 {
  now=Q.top();
  Q.pop();//use priority queue to ensure pop the point with min minres[][]
  tmp=now.point;

  int p1,d1,c1;
  //update paths connect to point tmp

  for (i=0;i<map[tmp].size();i++)
  {
   p1=map[tmp][i].point;
   d1=map[tmp][i].dis;
   c1=map[tmp][i].cost;
   if((minres[p1][0]>minres[tmp][0]+d1||
    minres[p1][0]==minres[tmp][0]+d1&&minres[p1][1]>minres[tmp][1]+c1)&&
    !used[p1])
   {
    minres[p1][0]=minres[tmp][0]+d1;
    minres[p1][1]=minres[tmp][1]+c1;
    now.point=p1;
    now.dis=minres[p1][0];
    now.cost=minres[p1][1];
    Q.push(now);
   }
  } 
 }
 used[tmp]=true;
}

int main()
{
 while(scanf("%d%d",&n,&m)!=EOF&&!(m==0&&n==0))
 {
  int a,b,d,p;
  for (int i=1;i<=n;i++)
   map[i].clear();///////////千万注意!
  while(m--)
  {
   scanf("%d%d%d%d",&a,&b,&d,&p);
   map[a].push_back(Map(b,d,p));
   map[b].push_back(Map(a,d,p));
  }
  scanf("%d%d",&a,&b);
  bfs(a,b);
  printf("%d %d\n",minres[b][0],minres[b][1]);
 }
}

题目五:二叉搜索树

/************************************************************************/
/*3791  二叉搜索树

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 556    Accepted Submission(s): 242


Problem Description
判断两序列是否为同一二叉搜索树序列


Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。


Output
如果序列相同则输出YES,否则输出NO


Sample Input
2
567432
543267
576342
0


Sample Output
YES
NO


Source
浙大计算机研究生复试上机考试-2010年
                                                                     */
/************************************************************************/

#include "iostream"
#include "string"
using namespace std;

string pro;
string origin;

struct Tree
{
    char name;
    Tree* l;
    Tree* r;
    Tree()
    {
        l=r=NULL;
    }
};

bool equal(Tree *a,Tree *b)
{
    if(a==NULL&&b==NULL)
        return true;
    else if(a==NULL&&b!=NULL||a!=NULL&&b==NULL)
        return false;
    if (a->name==b->name)
        return equal(a->l,b->l)&&equal(a->r,b->r);
    return false;
}

void insert(Tree** root,char c)
{
    if (*root==NULL)
    {
        *root=new Tree;
        (*root)->name=c;
    }
    else
    {
        if (c<(*root)->name)
            insert(&(*root)->l,c);
        else
            insert(&(*root)->r,c);
    }
}


int main()
{
    int n,in;
    while (scanf("%d",&n)!=EOF&&n!=0)
    {
        cin>>origin;
        Tree *t1=NULL;
        for(in=0;in<origin.length();in++)
            insert(&t1,origin[in]);

        for (int i=0;i<n;i++)
        {
            cin>>pro;       

            Tree *t2=NULL;
            for(in=0;in<pro.length();in++)
                insert(&t2,pro[in]);

            if(equal(t1,t2))
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
}

 

 

你可能感兴趣的:(浙大计算机研究生复试上机考试-2010年 .)