北邮2012新生赛

        昨天真是累了一天,是我到北邮后最累的一天。。。

        前一天晚上接到宸瀚的电话,说让我早上8点和他一起到本部,有一个迎接南太平洋大学校长到我校参观的晚会让我们去实习做中控,哎,原以为早上去就是为了中控的,结果突然想起,前几天他给我说了学校的编程新生赛,我们报了名,今天就是正式考试的日子。

        ╮(╯▽╰)╭,自从2010年上半年意外发生,从此远离OI,就没怎么碰过编程了,自己也不愿意去接触,总有种伤心地感觉。但是周四的时候,在宸瀚极力鼓励下,我还是帮了名,呵呵,有一项是填写AC的题数,我还可以打开巴蜀的OJ看了看,自己有690道题在那里压着呢,就填了个690,还真没想到为昨天买下了伏笔。

        到了本部,找到了919,看了看贴在墙上的名单,在最后几个中我找到了自己的名字,名字旁边竟然还有个手写的690,额,难道我成了他们的重点关注对象???晕。哎,自己也不管这么多,只是想来玩玩。

        坐在电脑前,开着Dev,熟悉的属于我自己的黑色界面风格,哎,往年的场景历历在目,高中的那些周末,那些寒假,我们一起做过的题……

        虽然说是禁止了U盘,但是我的竟然插上了,哎,我的纸质资料都在家里,能有的都在U盘里了,哎,学长们,理解下哈。

        话说有八道题,按照ACM的升气球模式,呵呵,我倒没经历过气球呢。

        冥思苦想,第一个写出来的应该是

没想那么多,DP已经忘完了,所以就模拟:

/*
Problem Id: 307
Submit time: 2012-02-26 11:49:13
User_id: 10163
Memory:144K   Time:18MS
Language:G++  Result:Accepted
*/
#include<iostream>
using namespace std;

int n,m;
int a[10];

void calc(int x)
{
     int i;
     while( x>0 )
     {
            a[x%10]++;
            x/=10;
     }
}

void doit()
{
     int i,j;
     for( i=n ;i<=m ;i++ ) calc(i);
     for( i=0 ;i<9 ;i++ ) cout<<a[i]<<" ";cout<<a[9];cout<<endl;
}

int main()
{
    while( scanf("%d%d",&n,&m)!=EOF )
    {
           memset(a,0,sizeof(a));
           doit();
    }
    
    
    return 0;
}

AC的第二题:


简单模拟,由于很久没写代码了,还是写了一会儿,如下:

/*
Problem Id: 301
Submit time: 2012-02-26 12:11:42
User_id: 10163
Memory:148K   Time:20MS
Language:G++  Result:Accepted
*/
#include<iostream>
using namespace std;
const double HALF=0.5;

long long a,n;

int m;
int d[1001];

long long sqr(long long a,long long b)
{
     int i,j,k;
     long long ans=a;
     d[0]=0;
     i=b;
     while( i>0 )
     {
            d[++d[0]]=i%2;
            i/=2;
     }
     for( i=d[0]-1 ;i>0 ;i-- )
     {
          ans*=ans;
          if( d[i] ) ans*=a;
     }
     return ans;
}



void Doit()
{
     
     long long i,j,k;
     long long SUM=0;
     long long tmp,tmp1;
     for( i=m+1 ; ;i++ )
     {
          a=sqr(2,i);
          tmp1=n+a/2;
          tmp=tmp1/(a);
          if( tmp<1 ) break;
              else SUM+=tmp;
     }
     cout<<SUM<<endl;
}

int main()
{
    while( cin>>n>>m )
    {
           Doit();
    }
    return 0;
}

然后呢,就是同一个题,只不过弱版和强版的:


我都是转化为LIS来做的,很奇特的想法……弱版:

/*
Problem Id: 305
Submit time: 2012-02-26 12:54:25
User_id: 10163
Memory:144K   Time:2MS
Language:G++  Result:Accepted
*/
#include<iostream>
using namespace std;

int n;
int a[101];
int b[101];
int d[101];
int f[101];

bool c[101];

int F(int a,int b)
{
    if( a-b >0 ) return 1;
    if( a-b==0 ) return 0;
    if( a-b <0 ) return -1; 
}

void Doit()
{
     int i,j,k;
     int cnt=0;
     int Max=-0x7FFFFFFF;
     for( i=2 ;i<=n ;i++ ) d[i]=b[i]=F(a[i],a[i-1]);
     d[1]=b[1]=-b[2];
     if( b[1]==-1 )
     { 
         cnt+=3;
         d[1]+=cnt;
     }
     for( i=2 ;i<=n ;i++ )
     {
          if( b[i]==-1 && b[i-1]!=-1 ) cnt+=3;
          d[i]+=cnt;
     }
     for( i=2 ;i<=n ;i++ ) if( d[i]==d[i-1] ) c[i]=1;
     /*
     for( i=1 ;i<=n ;i++ ) 
          if( !c[i] ) 
              cout<<d[i]<<" ";cout<<endl;
     */
     
     for( i=2 ;i<=n ;i++ )
          if( !c[i] )
              for( j=1 ;j<i ;j++ )
                   if( !c[j] )
                       if( d[i]>=d[j] && f[j]+1>f[i] )
                           f[i]=f[j]+1;
           
     for( i=1 ;i<=n ;i++ )
          if( Max<f[i] && !c[i] )
              Max=f[i];
     if( Max<3 ) cout<<"1\n";
         else 
         cout<<Max<<endl;
     
}

int main()
{
    while( cin>>n )
    {
           for( int i=1 ;i<=n ;i++ )
           { 
                cin>>a[i];
                f[i]=1;
                b[i]=0;
                c[i]=0;
                d[i]=0;
           }
           Doit();       
    }
    
   // system("pause");
    return 0;
}

强版:

/*
Problem Id: 306
Submit time: 2012-02-26 15:18:57
User_id: 10163
Memory:2192K   Time:425MS
Language:G++  Result:Accepted
*/
#include<iostream>
using namespace std;

const int MAXN=100001;

int n;
int a[MAXN];
int b[MAXN];
int d[MAXN];
int f[MAXN];
int dp[MAXN];

bool c[MAXN];

int F(int a,int b)
{
    if( a-b >0 ) return 1;
    if( a-b==0 ) return 0;
    if( a-b <0 ) return -1; 
}

int find(int aim,int st,int ed){
    int i=st,j=ed;
    int p=0;
    while( i<=j ){
           int mid=(i+j)/2;
           if( dp[mid]>aim ) j=mid-1;
           else{
                p=mid;
                i=mid+1;
                }
    }
    return p;
}

void Doit()
{
     int i,j,k;
     int cnt=0;
     int Max=-0x7FFFFFFF;
     int m=1;
     for( i=2 ;i<=n ;i++ ) if( a[i]==a[i-1] ) c[i]=1;
     for( i=2 ;i<=n ;i++ ) if( !c[i] ) a[++m]=a[i];
     n=m;
     for( i=2 ;i<=n ;i++ ) 
          d[i]=b[i]=F(a[i],a[i-1]);
     
     d[1]=b[1]=-b[2];
     if( b[1]==-1 )
     { 
         cnt+=3;
         d[1]+=cnt;
     }
     
     for( i=2 ;i<=n ;i++ )
     {
          if( b[i]==-1 && b[i-1]!=-1 ) cnt+=3;
          d[i]+=cnt;
     }
     memset(c,0,sizeof(c));
     for( i=2 ;i<=n ;i++ ) if( d[i]==d[i-1] ) c[i]=1;
     dp[1]=d[1];
     k=1;
     for( i=2 ;i<=n ;i++ )
     if( !c[i] )
     {

          int p=find(d[i],1,k);
          f[i]=++p;
          dp[p]<?=d[i];
          k>?=p;
          Max>?=f[i];
     }
     if( Max<3 ) cout<<"1\n";
         else 
         cout<<Max<<endl;
     
}

int main()
{
    while( cin>>n )
    {
           for( int i=1 ;i<=n ;i++ )
           { 
                cin>>a[i];
                f[i]=1;
                b[i]=0;
                c[i]=0;
                d[i]=0;
                dp[i]=0x7FFFFFFF;
           }
           Doit();       
    }
    return 0;
}
哎,还是留个图片留做纪念吧(看见我的四个气球木有吖,(*^__^*) 嘻嘻…………)

哎,话说晚上的晚会,确实不错唷,哈哈

PS:晚上回校晕死我了,差点吐了……



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值