排列组合:poj 3252 Round Numbers

题目链接:http://poj.org/problem?id=3252

解题思路:

怎么做我就不详细说了,统计半开半闭区间(0,n】所有Round Number的个数,枚举所有可能的情况,组合数相加(之前要打表),注重问题的分析过程。

比较好的解题报告:

(1)小優YoU http://blog.csdn.net/lyy289065406/article/details/6648458

(2)kuangbin:http://www.cnblogs.com/kuangbin/archive/2012/08/22/2651730.html

(3)discuss:   http://hi.baidu.com/ycdoit/item/6f64473c54a88f607d034b7f

有几个问题并没有解决,还望高人指点:

(1)组合数int c[34][34]能过,long long c[34][34]过不了,我打表比较过,值都是相同的,不存在越界问题,对组合数的处理也仅仅是累加,不知道为什么过不了

(2)还是组合数的问题,c[0][0]=1是为了打表,理论上应该是c[0][0]=0,大家有没有注意到,你在计数的过程中累加了c[0][0],(换句话说,当你考虑长度=1时的Round Number时,累加了c[]0[0]),我测试了几组数据,部分结果会和AC结果相差1.我觉得要么不考虑长度=1的情况,要么再打表结束时赋值c[]0[0]=0,这样做才是标准答案,也有可能我没有想的更加深入,浮于表面,但至少对我来说还是个问题。以后慢慢思考……


参考代码+部分解释:

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
#include 
       
       
         #include 
        
          #include 
         
           using namespace std; typedef long long ll; const int maxn = 1e6+10; int c[34][34]; int bin[34]; void init() { c[0][0]=1; //违背常理的初始化,要记住 for(int i=1;i<34;i++) for(int j=0;j<=i;j++) c[i][j]=(j==0)?c[i-1][j]:c[i-1][j]+c[i-1][j-1]; } ll solve(int n) //统计左开右闭区间(0,n]内的Round Number个数 { ll ans=0; int t=0; while(n){ //十进制转化为二进制,长度记为t bin[++t]=n%2; n>>=1; } for(int i=t-1;i>1;i--)//长度小于t的Round Number个数求和,0非正整数,长度为1舍去 for(int j=(i+1)/2;j 
          
            =1;i--)//长度等于t的Round Number个数求和 if(bin[i]==1){ for(int j=(t+1)/2-(zero+1);j 
           
             =t&&cnt!=t) ans++; return ans; } int main() { // freopen("input.txt","r",stdin); init(); int start,end; while(cin>>start>>end){ cout< 
            
              < 
              
             
            
           
          
         
       
     
     
    
    
   
   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值