回 帖 发 新 帖 刷新版面

主题:[转帖]2007百度之星5月27号全部初赛题

1.百度时间 
 Baidu的服务器上使用的不是北京时间,而是Baidu时间。Baidu时间的时分秒与北京时间相同,但是日期与北京时间不同,是用一个正整数表示从2000年1月1日开始经过了几天。

现在就请大家设计一个程序将北京时间转换为百度时间。在本题中,闰年的年份是400的倍数,或者是4的倍数但不是100的倍数。比如2000和8888均为闰年,但6100不是。


输入格式
输入数据的每一行为一个待转化的北京时间(不含空格和TAB),正确的格式包括两种:
一种为:YYYY-MM-DD,(YYYY表示四位数年份,MM为两位月份,DD为两位日期);
另一种为:MM  YY,(YYYY表示四位数年份,MM为两位月份,DD为两位日期);


输出格式
每个数据输出一行。如果可以成功转换,输出一个正整数,否则输出Error。 

输入样例 例
2000-01-01
AStar2007
05/26/2007


输出样例 例
0
Error
2702


评分规则


程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过1秒,否则该用例不得分;

要求程序能按照输入样例的格式读取标准输入数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;

该题共有5个测试数据集,数据1和数据2中的所有日期均能成功转换。所有数据中,每行不超过20个字符,每组数据最多包含100行;

回复列表 (共22个回复)

11 楼

谢谢分享...

12 楼

第一题答案:

[code]
/***********************************
     Input : 2000-01-01
                or 01/01/2000
     output: 0
     ***********************************/
    
    #include <stdio.h>
    #include <string.h>
        
    #define MAX    50
    
    int main(int argc, char *argv[])
    {
        int i,j,k,len;    
        long year=0,month=0,day=0,days=0,lunyear=0,pinyear=0;
        char st[MAX];
        
        scanf("%s",st);
        len = strlen(st);
        
        if ( st[len-3] == '-')
        {
            for(i=len-7,j=1; i>=0 ; i--,j*=10)
            year += (st[i]-'0')*j ;
            month = (st[len-5]-'0')*10 + (st[len-4]-'0') ;
            day = (st[len-2]-'0')*10 + (st[len-1]-'0') ;
        }
        
        else if ( st[2] == '/')
        {
            for (i=len-1,j=1; i>=6 ; i--,j*=10)
            year += (st[i]-'0') *j ;
            month = (st[0]-'0')*10 + (st[1]-'0');
            day = (st[3]-'0')*10 + (st[4]-'0') ;
        }
        else
        {
            printf("error\n");
            return 0 ;
        }
        
        
        lunyear = (year/4 -500) - (year/100-20) + (year/400 - 5) ;
        if ( year > 2000 )
        lunyear ++ ;
        pinyear = year - 2000 - lunyear ;
        
        
        
        if ( month <= 8 )
        {
            month -= 1 ;        
            
            if (month%2 == 0 )
            days += (month/2)*31 + (month/2)*30 + day ;
            else
            days += (month/2+1)*31 + (month/2)*30 + day ;
        }
        else
        {
            month -= 1 ;
            
            if (month%2 == 0)
            days += (month/2+1)*31 + (month/2-1)*30 + day ;
            else
            days += (month/2+1)*31 + (month/2)*30 + day ;
        }
        
        if ( month > 1)
        {
        if ( (year % 400 == 0) || ( year %4 == 0 && year %100 !=0) )
        days -= 1 ;
        else
        days -= 2 ;
        }
        
        days += lunyear *366 + pinyear *365 ;
        
        
        printf("%ld\n",days-1);
        
        return 0 ;
    }             
                
        
[/code]

13 楼

偶第一题满分,第四题也得了部分分。
题目我的博客上有。

14 楼

偶第一题满分。关键考虑思维的全面性。
第四题部分分。算法时间要求高。
可以见我的博客

15 楼

ding a 


16 楼


测试数据在哪里了

17 楼

第一题(供参考)
#include<iostream>
#include<cstring>
using namespace std;
int isprime(int year)
{
    int flag;
    if(year%4==0&&year%100!=0||year%400==0)
        flag=1;
    else flag=0;
    return flag;
}
void calculate(char str[])
{
    int len,year=0,month=0,day=0,i,j,y=1,m=0,days=0,years;
    int monthdays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    len=strlen(str);//cout<<str<<len<<endl;
    if(str[len-3]=='-'&&str[len-6]=='-')
    {
        for(i=len-7;i>=0;i--)
        {
            m=(str[i]-48)*y;//cout<<str[i]<<" "<<y<<" "<<m<<endl;
            year=year+m;//cout<<year<<endl;
            y=10*y;
        }
        month=(str[len-5]-48)*10+str[len-4]-48;
        day=(str[len-2]-48)*10+str[len-1]-48;
        if(year<2000)
            cout<<"error!"<<endl;
        else
        {
        years=year-2000;
         for(i=0;i<years;i++)
         {
            days=days+365;
            if(isprime(2000+i))
            days++;
         }
         j=month-1;
         if(j>=2)
         {
             for(i=0;i<j;i++)
            days=days+monthdays[i];
             if(isprime(year))
                 days++;
         }
         else if(j==1)
             days=days+31;
           days=days+day-1;
         cout<<days<<endl;
        }
    }
    else if(str[2]=='/'&&str[5]=='/')
    {
         for(i=len-1;i>=6;i--)
        {
            m=(str[i]-48)*y;
            year=year+m;
            y=10*y;
        }
        month=(str[0]-48)*10+str[1]-48;
        day=(str[3]-48)*10+str[4]-48;
        if(year<2000)
            cout<<"error!"<<endl;
        else
        {
        years=year-2000;
         for(i=0;i<years;i++)
         {
            days=days+365;
            if(isprime(2000+i))
            days++;
         }
         j=month-1;
         if(j>=2)
         {
             for(i=0;i<j;i++)
            days=days+monthdays[i];
             if(isprime(year))
                 days++;
         }
         else if(j==1)
             days=days+31;
           days=days+day-1;
         cout<<days<<endl;
        }
    }
    else
        cout<<"error!"<<endl;
}
int main()
{
    char str[20];
    cin.getline(str,20);
    calculate(str);
    return 0;
}

18 楼

&#31532;&#19968;&#39064;&#31572;&#26696;&#65306;
#include<iostream>
#include<string.h>
#include<cctype>
using std::cin;
using std::cout;
void totime1();
void totime2();
void islun(int);
void result();
int days[3];
char date[20];
long time1=0;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int a;
int main()
{
    
    cin>>date;
    a=strlen(date);
    if(a<10)
    {
        cout<<"Error";
        exit(0);
    }
    else 
    {
        for(int i=0;i<3;i++)
            days[i]=0;
        if(date[2]=='/' && date[5]=='/')
        {
            totime1();
            result();
            
        }
        else if(date[a-10+4]=='-' && date[a-10+7]=='-')
        {
            totime2();
            result();

        }
        else 
        {
            cout<<"Error";
            exit(0);
        }    

    }
    cout<<time1-1;
}
void totime1()
{    
    int j=1;
    for(int i=0;i<a;i++)
    {
        if(i==2)
            j--;
        else if(i==5)
            j=2;
        else
        {         
            if(!isdigit(date[i]))
                break;
            days[j]=days[j]*10+date[i]-48;
        }                
    }
}
void totime2()
{
    int j=2;
    for(int i=0;i<a;i++)
    {
        if(i==a-10+4 || i==a-10+7)
            j--;
        else
        {
            if(!isdigit(date[i]))
                break;
            days[j]=days[j]*10+date[i]-48;
        }
    }
}
void islun(int year)
{
    if(year%400==0 || (year%4==0 && year%100!=0))
        time1+=366;
    else
        time1+=365;

}
void result()
{
    if( days[2]%400==0 || ( days[2]%4==0 && days[2]%100!=0 ) )
        month[2]=29;
    if(days[2]<2000 || days[1]>12 || days[1]<=0 || days[0]<=0 || days[0]>month[days[1]] )
    {
        cout<<"Error";
        exit(0);
    }
    for(int i=2000;i<days[2];i++)
        islun(i);
    for(int j=1;j<days[1];j++)
        time1+=month[j];
    time1+=days[0];        

}

19 楼

#include<iostream>
using namespace std;
class handle
{
    private:
    int left;
    int right;
    public:
    handle() {     left=0; right=0; }
    void setleft(int x) { left=x; right-=left; }
    int nopower();
    void setright(int y) { right=y;left-=right; }
    void setdouble(int x,int y){ left=x; right=y; }
    void setcurrent(int x){ left-=x; right-=x; }
    int shortpower(){ left<=right ? left : right; }                
    int longpower(){ left>=right ? left : right; }


}

int handle::nopower()
{
    if(left>right)
        return 1;
    else if(left<right)
        return 2;
    else return 0;    

}

//int total;
void longtime(int** a);
void shorttime(int** a);
int time1,time2;
int total;
int number;
handle hand1,hand2;

int main()
{    
    int** a;
    //int a[10][2];
    //int* b,c;
    int temp;
    total=0;
    cin>>number;
    time1=0;
    time2=0;
    //b=new int[number];
    a=new int[number][2];
    //c=new int[number];
    for(int i=0;i<number;i++)
    {
        
        if( cin>>a[i][0]>>a[i][1] && a[i][1]<0 && a[i][0]<0)
        {
            cout<<"Error";
            exit(0);
        }
        total+=a[i][1];
                
    }
    int y=0;
    for(int j=0;j<number-1;j++)
    {    
        y=j;
        for(int l=j+1;l<number;l++)
        if(a[y][0]<=a[l][0])
            y=l;
        if(y!=j)
        {
            temp=a[y][0];
            a[y][0]=a[j][0];
            a[j][0]=temp;
            temp=a[y][1];
            a[y][1]=a[j][1];
            a[j][1]=temp;
        }            

    }
    
    longtime(a);
    shorttime(a);
    cout<<time1<<"  "<<time2;
    return 0;
}

20 楼

void longtime(int** a)
{
    int k=0;    
    int y=0;
    int b;
    for(int y=0;y<total;y++)
    {    
        if(a[k][1]<1)
            k++;
        if(k==number && a[k][1]==0)
            break;

        if(hand1.shortpower()<hand2.shortpower())
        {
            if(hand1.nopower()==1)
            {
                hand1.setleft(a[k][0]);        
            }    
            else if(hand1.nopower()==2)
                hand1.setright(a[k][0]);
            else if(hand1.nopower()==0)
            {
                if(k==0 && a[k][1]<2)
                    break;
                if(a[k][1]==1)
                {
                    b=a[k][0];
                    k++;    
                }
                else
                {
                    b=a[k][0];
                    a[k][1]--;
                }
                hand1.setdouble(a[k][0],b);
                y++;
                
            }
            
            hand2.setcurrent(hand1.shortpower());
        }
        else if(hand1.shortpower()==hand2.shortpower())
        {
            if(hand1.longpower()>=hand2.longpower())
            {
                if(hand1.nopower()==1)

                    hand1.setleft(a[k][0]);
            
                else if(hand1.nopower()==2)

                    hand1.setright(a[k][0]);

                else if(hand1.nopower()==0)
                {
                    if(k==0 && a[k][1]<3)
                        break;
                    if(a[k][1]==1)
                    {
                        b=a[k][0];
                        k++;    
                    }
                    else
                    {
                        b=a[k][0];
                        a[k][1]--;
                    }
                    hand1.setdouble(a[k][0],b);
                    y++;
                }
                y++;
                a[k][1]--;
                if(a[k][1]<1)
                    k++;
                if(k==number && a[k][1]==0)
                    break;    
                if(hand2.nopower()==1)
                {
                    hand2.setleft(a[k][0]);        
                }    
                else if(hand2.nopower()==2)
                    hand2.setright(a[k][0]);
                else if(hand2.nopower()==0)
                {
                    if(k==0 && a[k][1]<2)
                        break;
                    if(a[k][1]==1)
                    {
                        b=a[k][0];
                        k++;    
                    }
                    else
                    {
                        b=a[k][0];
                        a[k][1]--;
                    }
                    hand2.setdouble(a[k][0],b);
                    y++;
                }
                
            }
            else 
            {

                if(hand2.nopower()==1)
                {
                    hand2.setleft(a[k][0]);        
                }    
                else if(hand2.nopower()==2)
                    hand2.setright(a[k][0]);//handle2
                
                a[k][1]--;
                if(a[k][1]<1)
                    k++;
                if(hand1.nopower()==1)

                    hand1.setleft(a[k][0]);
            
                else if(hand1.nopower()==2)

                    hand1.setright(a[k][0]);

                else if(hand1.nopower()==0)
                {
                    if(k==0 && a[k][1]<2)
                        break;
                    if(a[k][1]==1)
                    {
                        b=a[k][0];
                        k++;    
                    }
                    else
                    {
                        b=a[k][0];
                        a[k][1]--;
                    }
                    hand1.setdouble(a[k][0],b);
                    y++;
                }
                
                
            }

                
        }
        else
        {
            if(hand2.nopower()==1)
            {
                hand2.setleft(a[k][0]);        
            }    
            else if(hand2.nopower()==2)
                hand2.setright(a[k][0]);
            else if(hand2.nopower()==0)
            {    
                if(k==number && a[k][1]<2)
                    break;
                if(a[k][1]==1)
                {
                    b=a[k][0];
                    k++;    
                }
                else
                {
                    b=a[k][0];
                    a[k][1]--;
                }
                hand2.setdouble(a[k][0],b);
                y++;
                
            }

            hand1.setcurrent(hand2.shortpower());
        }
        
        a[k][1]--;
    
    time1+=hand1.shortpower()<hand2.shortpower()?hand1.shortpower():hand2.shortpower();
    
    }


}

我来回复

您尚未登录,请登录后再回复。点此登录或注册