主题:[转帖]2007百度之星5月27号全部初赛题
waterring
[专家分:0] 发布于 2007-05-27 18:53:00
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行;
最后更新于:2007-05-27 19:29:00
回复列表 (共22个回复)
11 楼
vcacm [专家分:1500] 发布于 2007-05-28 17:19:00
谢谢分享...
12 楼
vcacm [专家分:1500] 发布于 2007-05-31 08:54:00
第一题答案:
[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 楼
acm_pzh [专家分:0] 发布于 2007-06-15 00:33:00
偶第一题满分,第四题也得了部分分。
题目我的博客上有。
14 楼
acm_pzh [专家分:0] 发布于 2007-06-15 00:35:00
偶第一题满分。关键考虑思维的全面性。
第四题部分分。算法时间要求高。
可以见我的博客
15 楼
pchen_88 [专家分:0] 发布于 2008-08-18 22:38:00
ding a
16 楼
cpluscplus [专家分:0] 发布于 2008-09-20 14:08:00
测试数据在哪里了
17 楼
地球人民 [专家分:70] 发布于 2008-10-19 10:58:00
第一题(供参考)
#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 楼
liuwenhan [专家分:20] 发布于 2008-11-26 18:48:00
第一题答案:
#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 楼
liuwenhan [专家分:20] 发布于 2008-11-26 18:54:00
#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 楼
liuwenhan [专家分:20] 发布于 2008-11-26 18:55:00
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();
}
}
我来回复