读研上机水题整理——浙大2005
Posted 娇渣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读研上机水题整理——浙大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 }
以上是关于读研上机水题整理——浙大2005的主要内容,如果未能解决你的问题,请参考以下文章
编程训练-考研上机模拟综合模拟2-2019浙大上机模拟(晴神)
编程训练-考研上机模拟综合模拟1-2019浙大上机模拟(晴神)
2019浙大校赛--J--Extended Twin Composite Number(毒瘤水题)