码迷,mamicode.com
首页 > 其他好文 > 详细

2015苏州大学ACM-ICPC集训队选拔赛(3)题解

时间:2015-12-29 22:51:55      阅读:544      评论:0      收藏:0      [点我收藏+]

标签:

1001

1002

1003

1004

这是一道二进制题,题目上已经有提示了。n个树坑可以看成是n位二进制数,没有种树的位置上值为0,种树的位置上值为1。这样只需要枚举所有的n位二进制数,求出每一位上的值,再判断是否至少有1以及任意两个1之间是否距离至少为m。

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 using namespace std;
 7 int a[100];
 8 
 9 int main()
10 {
11     int n,m,k;
12     while(~scanf("%d%d%d",&n,&k,&m))
13     {
14         int ans=0;
15         for(int i=0;i<(1<<n);++i)
16         {
17             int cnt=0;
18             memset(a,0,sizeof(a));
19             int num=i;
20             while(num!=0)
21             {
22                 a[cnt++]=num%2;
23                 num=num/2;
24             }
25             int count=0;
26             num=1;
27             bool f=true;
28             for(int j=0;j<cnt;++j)
29             {
30                 if(a[j]==1)
31                 {
32                     if(num<m&&j!=0)
33                         f=false;
34                     count++;
35                     num=1;
36                 }
37                 else 
38                     num++;
39             }
40             if(f&&count>=k)
41                 ans++;
42         }
43         printf("%d\n",ans);
44     }
45      return 0;
46 }
View Code

 

1005

签到题。将所有给出的数转化成10进制数,注意a~f的情况。用一个长度为1000的数组保存每个数出现的次数,最后遍历一遍数组找到出现次数最多的数即可。

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 using namespace std;
 7 int num[1200];
 8 char a[10]={a,b,c,d,e,f};
 9 int main()
10 {
11     int t,n;
12     char s[20];
13     while(~scanf("%d",&t))
14     {
15         memset(num,0,sizeof(num));
16         while(t--)
17         {
18             scanf("%d %s",&n,s);
19             int c=0;
20             for(int i=0;i<strlen(s);++i)
21             {
22                 if(s[i]>=0&&s[i]<=9)
23                 {    
24                     c=c*n;            
25                     c+=s[i]-0;
26                 }
27                 else
28                 {
29                     c=c*n;
30                     c+=s[i]-a+10;
31                 }
32             }
33             num[c]++;
34         }
35         int max=0;
36         int ans=0;
37         for(int i=0;i<=1000;++i)
38         {
39             if(num[i]>max)
40             {
41                 max=num[i];
42                 ans=i;
43             }
44         }
45         printf("%d\n",ans);
46     }
47      return 0;
48 }
View Code

 

1006

很经典的一道题,也算是签到题。解决这道题的方法很多,这里就只给出最优的方案。我们需要保存一个当前最大的子序列和maxsun以及从1开始的子序列的和thissum。当thissum>maxsum时,maxsum赋值为thissum,当thissum<0时,thissum赋值为0。这样遍历一遍数组,thissum每次加上遍历到的数,并进行更新,最后maxsum保存的便是最大的子序列和。

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     long long  ThisSum,MaxSum,i,a,n;
10        while(~scanf("%d",&n))
11     {
12            
13            ThisSum = MaxSum = 0 ;
14            for( i=0 ; i<n ; i++ )
15            {
16                scanf("%I64d",&a);
17              ThisSum += a;
18        
19                if( ThisSum > MaxSum )
20                 MaxSum = ThisSum ;
21                else
22                 if( ThisSum < 0)
23                        ThisSum = 0 ;
24           }
25         printf("%I64d\n",MaxSum);
26     }
27      return 0;
28 }
View Code

 

1007

1008

1009

1010

 

2015苏州大学ACM-ICPC集训队选拔赛(3)题解

标签:

原文地址:http://www.cnblogs.com/yaoyueduzhen/p/5087230.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!