读研上机水题整理——浙大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 }

 

posted @ 2017-09-14 22:39  娇渣  阅读(218)  评论(0编辑  收藏  举报