USACO Section 1.5

      昨天看了一天的《天堂绣》,挺好看的,顺便给各位推荐,既偶像(陆毅+韩智慧异国恋);又有底蕴,讲述中国苏州的手绣古董流失海外和手绣艺术向海外的传播。

今天下午才开始A题,又水了四道。终于到了第二单元。

代码:

numtri: 数塔,如此简单的动规。

代码:

/*
ID: duanjia2
PROG: numtri
LANG: C++
*/
#include<iostream>
#include<string.h>
#include<fstream>
#include<stdio.h>
using namespace std;
int tow[1001][1002];
int main()
{
    ifstream fin("numtri.in");
    ofstream fout("numtri.out");
    int n,i,j,a;
    memset(tow,0,sizeof(tow));
    fin>>n;
    for( i=1;i<=n;i++)
     for( j=1;j<=i;j++){
          fin>>a;
          tow[i][j]=max(tow[i-1][j-1],tow[i-1][j])+a;
     }
     int mx=0;
    for( i=1;i<=n;i++)
         if(mx<tow[n][i])
            mx=tow[n][i];
    fout<<mx<<endl;
   // system("pause");
    return 0;
}
pprime: 即使回文又是素数。我先枚举回文在判断素数,有提示的哟.我可是纯枚举。

代码:

/*
ID: duanjia2
PROG: pprime
LANG: C++
*/

#include<iostream>
#include<string.h>
#include<fstream>
#include<vector>
using namespace std;
bool Isprime(int num)
{
     for(int i=2;i*i<=num;i++)
          if(num%i==0)
            return false;
     return true;
}
int main()
{
    ifstream fin("pprime.in");
    ofstream fout("pprime.out");
      
     int i,j,s,m,k,num,a,b;
     s=0;
     fin>>a>>b;
     
     if( a<=2&&b>=2) cout<<2<<endl;
     for( i=3;i<=7;i+=2)
          if(i>=a&&i<=b)
             fout<<i<<endl;
     if( a<=11&&b>=11) fout<<11<<endl;
     
     bool flag=true;
     if( b>100&&a<1000){ 
     for( i=1;i<=9&&flag;i+=2) //3位回文 
          for( j=0;j<=9;j++){
               num=i*100+j*10+i;
               if(num<a) continue;
               if(num>b){ flag=false; break;}
               if( Isprime(num))
                   fout<<num<<endl;
          }
     }
     
     if( b>1000&&a<10000){        
     for( i=1;i<=9&&flag;i+=2) //4位回文 
          for( j=0;j<=9;j++){
               num=i*1000+j*100+j*10+i;
               if(num<a) continue;
               if(num>b){ flag=false; break;}
               if( Isprime(num))
                   fout<<num<<endl;
          }
     }
     
     if( b>10000&&a<100000){          
     for( i=1;i<=9&&flag;i+=2) //5位回文 
          for( j=0;j<=9&&flag;j++)
               for( k=0;k<=9;k++){
                    num=i*10000+j*1000+k*100+j*10+i;
                     if(num<a) continue;
                     if(num>b){ flag=false; break;}
                     if( Isprime(num))
                         fout<<num<<endl;
               }
     }
     
     if( b>100000&&a<1000000){               
     for( i=1;i<=9&&flag;i+=2) //6位回文 
          for( j=0;j<=9&&flag;j++)
               for( k=0;k<=9;k++){
                    num=i*100000+j*10000+k*1000+k*100+j*10+i;
                    if(num<a) continue;
                    if(num>b){ flag=false; break;}
                    if( Isprime(num))
                        fout<<num<<endl;
               } 
     }
     
     if( b>1000000&&a<10000000){                    
     for( i=1;i<=9&&flag;i+=2) //7位回文 
          for( j=0;j<=9&&flag;j++)
               for( k=0;k<=9&&flag;k++)
                    for( m=0;m<=9;m++){
                         num=i*1000000+j*100000+k*10000+m*1000+k*100+j*10+i;
                         if(num<a) continue;
                         if(num>b){ flag=false; break;}
                         if( Isprime(num))
                             fout<<num<<endl;
                    }
     }
   //  system("pause");
       return 0;
}
     
  
   
sprime:  一个数,从后往前去掉几位剩下的还是素数。7331 ,733,73,7都是素数。

枚举,都是枚举,崩溃。
代码:

/*
ID: duanjia2
PROG: sprime
LANG: C++
*/
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("sprime.in");
ofstream fout("sprime.out");
bool Isprime(int n)
{
     for(int i=2;i*i<=n;i++)
            if(n%i==0)
              return false;
     return true;
}
void Fn(int n,int cnt)
{
     int temp;
     if( n==0){ 
         fout<<cnt<<endl;
         return;
     }
     if( cnt==0){ //第一位可以为2,不可以为1,9 
         Fn( n-1,2 );
          for(int i=3; i<=7; i+=2){
                 Fn( n-1,i );
         }
     }   
    else{    //结尾只能为奇数,不然能被2除   
         for(int i=1; i<=9; i+=2){
             temp=cnt*10+i;
             if( Isprime(temp) )
                 Fn( n-1,temp );
         }
     }
}
int main()
{
    
    int n;
    fin>>n;
    Fn(n,0);
   // system("pause");
    return 0;
}
checker: n皇后问题,就是要输出前三种的解,按升序输出。我们按升序枚举就好了。

代码:

/*
ID: duanjia2
PROG: checker
LANG: C++
*/
#include<iostream>
#include<string.h>
#include<fstream>
using namespace std;
ifstream fin("checker.in");
ofstream fout("checker.out");
int col[15],n,cnt,ans[5][15],vis[3][30];
void Search(int cur)
{
     if( cur==n){
         if( cnt<3){
             for(int i=0;i<n;i++)
                  ans[cnt][i]=(col[i]+1);
         }
         cnt++; 
         return ;
     }
     else{
          for(int i=0; i<n; i++){ 
               if( !vis[0][i] && !vis[1][cur+i] && !vis[2][cur-i+n] ){   //如果列和对角线没有被占据 
                   col[cur]=i; 
                   vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
                   Search(cur+1);
                   vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
               }
          } 
     }          
}
int main()
{
    
    int i,j;
    fin>>n;
    memset(vis,0,sizeof(vis));
    cnt=0;
    Search(0);
    for( i=0;i<3;i++){
        fout<<ans[i][0];
        for( j=1;j<n;j++)
            fout<<' '<<ans[i][j];
        fout<<endl;
    }
    fout<<cnt<<endl;
  //  system("pause");
    return 0;
}
到这里我终于知道枚举枚的好也是很强大的。看我们选择怎么样去枚举。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值