读研上机水题整理——浙大2005

题目1014:排名

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<stdio.h>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<queue>
 7 #include<set>
 8 #include<map>
 9 #define LL long long
10 #define PI acos(-1)
11 #define exp 1e-9
12 #define INF 0x7fffffff
13 using namespace std;
14 priority_queue <int, vector<int>, greater<int> > Q;
15 struct node
16 {
17     char id[25];
18     int score;
19 };
20 bool cmp(node a, node b)
21 {
22     if(a.score!=b.score)
23         return a.score>b.score;
24     else
25     {
26         int tmp=strcmp(a.id,b.id);
27         return tmp<0;
28     }
29 }
30 int main()
31 {
32     int n,M,G,m,num;
33  
34     while(~scanf("%d",&n)&&n)
35     {
36         scanf("%d %d",&M,&G);
37         node student[1010];
38         for(int i=0; i<=1010; i++)
39             student[i].score=0;//memset(student[i].id,'\0',sizeof(student[i].id));
40         int list[15];
41         memset(list,0,sizeof(list));
42         for(int i=1; i<=M; i++)
43             scanf("%d",&list[i]);
44         for(int i=0; i<n; i++)
45         {
46             scanf("%s",student[i].id);
47             scanf("%d",&m);
48             for(int j=0; j<m; j++)
49             {
50                 scanf("%d",&num);
51                 //printf("%d\n",list[num]);
52                 student[i].score+=list[num];
53             }
54         }
55         sort(student,student+n,cmp);
56         int ans=0;
57         for(int i=0; i<n; i++)
58         {
59             //printf("%d\n",student[i].score);
60             if(student[i].score>=G)
61                 ans++;
62                 //printf("%s %d\n",student[i].id,student[i].score);
63         }
64         printf("%d\n",ans);
65          for(int i=0; i<n; i++)
66         {
67             if(student[i].score>=G)
68                 //ans++;
69                 printf("%s %d\n",student[i].id,student[i].score);
70         }
71     }
72  
73     return 0;
74 }

题目1013:开门人和关门人

不必排序,都转化为秒,记录最大值和最小值的位置,输出即可

题目1012:畅通工程

并查集题目,记得tree数组初始化和判断是否能组成最小生成树的方法,还要记得结点的取值范围是0-n-1,还是1-n

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<stdio.h>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<queue>
 7 #include<set>
 8 #include<map>
 9 #define LL long long
10 #define PI acos(-1)
11 #define exp 1e-9
12 #define INF 0x7fffffff
13 using namespace std;
14 priority_queue <int, vector<int>, greater<int> > Q;
15 int tree[1010];
16 int findRoot(int x)
17 {
18     if(tree[x]==-1)
19         return x;
20     else
21     {
22         int tmp=findRoot(tree[x]);
23         tree[x]=tmp;
24         return tmp;
25     }
26 }
27 int main()
28 {
29     int n,m,a,b;
30     while(~scanf("%d",&n)&&n)
31     {
32         scanf("%d",&m);
33         memset(tree,-1,sizeof(tree));
34         for(int i=0; i<m; i++)
35         {
36             scanf("%d %d",&a,&b);
37             a=findRoot(a);
38             b=findRoot(b);
39             if(a!=b)
40                 tree[a]=b;
41         }
42  
43         int ans=0;
44         for(int i=1; i<=n; i++)
45         {
46             if(tree[i]==-1)
47                 ans++;
48         }
49         printf("%d\n",ans-1);
50     }
51     return 0;
52 }
53  

题目1011:最大连续子序列

如果不要求写出最大连续子序列的起始和最终的值,要简答的多,这个就要记录下起始和终止的位置了

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<stdio.h>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<queue>
 7 #include<set>
 8 #include<map>
 9 #define LL long long
10 #define PI acos(-1)
11 #define exp 1e-9
12 #define INF 0x7fffffff
13 using namespace std;
14 priority_queue <int, vector<int>, greater<int> > Q;
15  
16 int main()
17 {
18     int k,list[10010];
19     while(~scanf("%d",&k)&&k)
20     {
21         for(int i=1; i<=k; i++)
22         {
23             scanf("%d",&list[i]);
24         }
25         int tmp=0,index=1;
26         int tmax=-10000;
27         int from,to;
28         for(int i=1; i<=k; i++)
29         {
30             tmp+=list[i];
31             if(tmax<tmp)
32             {
33                 tmax=tmp;
34                 from=index;
35                 to=i;
36             }
37             if(tmp<0)
38             {
39                 tmp=0;
40                 index=i+1;
41             }
42         }
43         if(tmax<0)
44             printf("0 %d %d\n",list[1],list[k]);
45         else
46             printf("%d %d %d\n",tmax,list[from],list[to]);
47     }
48     return 0;
49 }

 

posted @ 2017-09-14 21:53  娇渣  阅读(166)  评论(0编辑  收藏  举报