讀研上機水題整理——浙大2005
阿新 • • 發佈:2017-09-14
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 13using 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