1. 程式人生 > >讀研上機水題整理——浙大2005

讀研上機水題整理——浙大2005

include truct fin 判斷 algo 浙大 urn greate 最小值

題目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 }

讀研上機水題整理——浙大2005