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 }
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 }
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 }
1007
1008
1009
1010
时间: 2024-10-15 20:08:42