读研上机水题整理——浙大2007
题目1025:最大报销额
现在看这个问题很明显的背包,不过是加了一点限制条件,但是double类型的数据很难搞,还是没想到要乘100,不过现在看看当时写的贪心有些乱,大概是当时不够熟悉吧
1 #include<stdio.h> 2 #include<queue> 3 #include <string.h> 4 using namespace std; 5 struct node 6 { 7 double a,b,c,sum; 8 }data[35]; 9 double dp[1000110]; 10 int main() 11 { 12 int n,m; 13 double q,my; 14 char ch; 15 while(~scanf("%lf %d",&q,&n)&&n) 16 { 17 for(int i=0; i<n; i++) 18 data[i].a=data[i].b=data[i].c=data[i].sum=0; 19 for(int i=0; i<n; i++) 20 { 21 scanf("%d",&m); 22 23 for(int j=0; j<m; j++) 24 { 25 scanf(" %c:%lf",&ch,&my); 26 if(ch=='A') 27 data[i].a+=my; 28 else if(ch=='B') 29 data[i].b+=my; 30 else if(ch=='C') 31 data[i].c+=my; 32 else 33 data[i].sum=10000.0; 34 } 35 // printf("%lf %lf %lf\n",data[i].a,data[i].b,data[i].c); 36 } 37 memset(dp,0,sizeof(dp)); 38 double maxn=0.0; 39 for(int i=0; i<n; i++) 40 { 41 double sum=data[i].a+data[i].b+data[i].c; 42 //printf("%lf\n",sum); 43 int s=sum*100; 44 for(int j=q*100; j>=s; j--) 45 { 46 if(data[i].a<=600.0&&data[i].b<=600.0&&data[i].c<=600.0&&data[i].sum==0.0&&sum<=1000.0) 47 { 48 //printf("%d\n",j); 49 if(dp[j]<dp[j-s]+sum); 50 { 51 dp[j]=dp[j-s]+sum; 52 //printf("%lf\n",dp[j]); 53 maxn=max(maxn,dp[j]); 54 } 55 } 56 } 57 } 58 printf("%.2lf\n",maxn); 59 } 60 return 0; 61 } 62
题目1024:畅通工程
跟前面一个题目是一样的
题目1023:EXCEL排序
简单多级排序
题目1022:游船出租
这个题我现在想法都不那么顺畅,记录是否有S和E,以及怎么处理0,还有maxn,简直用的太好,还有除数不能为0
1 #include<stdio.h> 2 #include<queue> 3 #include <string.h> 4 using namespace std; 5 struct node 6 { 7 int s,e; 8 int tm; 9 }data[110]; 10 int main() 11 { 12 int n,a,b; 13 char chr; 14 int maxn=0,t=0; 15 double tmp=0; 16 for(int i=1; i<=100; i++) 17 { 18 data[i].s=-1; 19 data[i].e=-1; 20 } 21 while(~scanf("%d",&n)&&n!=-1) 22 { 23 scanf("%c %d:%d",&chr,&a,&b); 24 maxn=max(n,maxn); 25 if(n==0) 26 { 27 scanf("%c %d:%d",&chr,&a,&b); 28 for(int i=1; i<=maxn; i++) 29 { 30 //printf("%d\n",data[i].s); 31 if(data[i].s!=-1&&data[i].e!=-1) 32 { 33 t++; 34 data[i].tm=data[i].e-data[i].s; 35 //printf("%d\n",data[i].s); 36 tmp+=data[i].tm; 37 } 38 } 39 if(t ) 40 printf("%d %.lf\n",t,tmp/t); 41 else 42 printf("0 0\n"); 43 for(int i=1; i<=100; i++) 44 { 45 data[i].s=-1; 46 data[i].e=-1; 47 } 48 tmp=0; 49 maxn=0; 50 t=0; 51 } 52 else 53 { 54 if(chr=='S') 55 { 56 data[n].s=a*60+b; 57 } 58 else if(chr=='E') 59 { 60 data[n].e=a*60+b; 61 } 62 } 63 64 65 } 66 return 0; 67 }
题目1021:统计字符
边处理边输出
1 #include<stdio.h> 2 #include<queue> 3 #include <string.h> 4 using namespace std; 5 6 int main() 7 { 8 char s1[100],s2[300]; 9 while(gets(s1)) 10 { 11 int tmp=strcmp(s1,"#"); 12 if(!tmp) 13 { 14 break; 15 } 16 else 17 { 18 gets(s2); 19 int len1=strlen(s1); 20 int len2=strlen(s2); 21 for(int i=0; i<len1; i++) 22 { 23 int tmp=0; 24 for(int j=0; j<len2; j++) 25 { 26 if(s1[i]==s2[j]) 27 tmp++; 28 } 29 if(tmp) 30 printf("%c %d\n",s1[i],tmp); 31 } 32 } 33 } 34 return 0; 35 }