2017.9.6模拟考试

45 篇文章 0 订阅
33 篇文章 0 订阅

第二题

【题目描述】
给你两个日期,问这两个日期差了多少毫秒。
【输入格式】
两行,每行一个日期,日期格式保证为“YYYY-MM-DD hh:mm:ss”这种形
式。第二个日期时间一定比第一个日期时间要大两个日期的年份一定都是 21 世
纪的年份。
【输出格式】
一行一个整数代表毫秒数。
【样例输入 1】
2000-01-01 00:00:00
2000-01-01 00:00:01
【样例输出 1】
1000
【样例输入 2】
2000-01-01 00:00:00
2000-11-11 00:00:00
【样例输出 2】
27216000000
【样例解释】
从前有座山。
【数据范围与规定】
对于10%的数据, 两个日期相同。
对于20%的数据,两个日期只有秒数可能不同。
对于30%的数据,两个日期只有秒数、分钟数可能不同。
对于40%的数据,两个日期的年月日一定相同。
对于60%的数据,两个日期的年月一定相同。
对于80%的数据,两个日期的年份一定相同。
对于100%的数据,两个日期一定都是 21 世纪的某一天,且第二个日期一定
大于等于第一个日期。

//贴原来zjk大佬的标程,前80分很好做,后20分高精度
#include<cstdio>
#include<iostream>
#define N 110
#define rn 31622400000LL
#define pn 31536000000LL
#define ll long long
using namespace std;
char c[N];ll n[3],y[3],r[3],s[3],f[3],m[3];
ll r1[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
ll r2[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
void init(ll num)
{
    cin>>c;
    n[num]=(c[0]-'0')*1000+(c[1]-'0')*100+(c[2]-'0')*10+c[3]-'0';
    y[num]=(c[5]-'0')*10+c[6]-'0';
    r[num]=(c[8]-'0')*10+c[9]-'0';
    cin>>c;
    s[num]=(c[0]-'0')*10+c[1]-'0';
    f[num]=(c[3]-'0')*10+c[4]-'0';
    m[num]=(c[6]-'0')*10+c[7]-'0';
}
bool run(ll x)
{
    if(x%100==0)
    {
        if(x%400==0)return true;
        return false;
    }
    else if(x%4==0)return true;
    return false;
}
ll work(ll num)
{
    ll p=0;
    if(run(n[num]))
    {
        for(ll i=1;i<y[num];i++)p+=r1[i]*86400000;
        p+=(r[num]-1)*86400000+s[num]*3600000+f[num]*60000+m[num]*1000;
    }
    else
    {
        for(ll i=1;i<y[num];i++)p+=r2[i]*86400000;
        p+=(r[num]-1)*86400000+s[num]*3600000+f[num]*60000+m[num]*1000;
    }
    return p;
}
int main()
{
    //freopen("jh.txt","r",stdin);
    freopen("two.in","r",stdin);
    freopen("two.out","w",stdout);
    init(1);init(2);
    ll ans=0;
    for(ll i=n[1]+1;i<n[2];i++)
      if(run(i))ans+=rn;
      else ans+=pn;
    if(run(n[1]))ans+=rn;else ans+=pn;
    ans-=work(1);
    ans+=work(2);
    if(n[1]==n[2])
    {
        if(run(n[1]))ans-=rn;else ans-=pn;
    }
    cout<<ans;
    return 0;
}
//预计80,实测70  代码存档
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int months_days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_run1,is_run2;
int year1,year2,month1,month2,day1,day2,hour1,hour2,mint1,mint2,m1,m2,day,ss;
bool Judge(int x){
    if(x%4==0&&x%100!=0) return 1;
    if(x%100==0&&x%400!=0) return 0;
    if(x%400==0) return 1;
}

inline void Print(int x){
    if(!x) printf("0\n");
    else cout<<x<<"000"<<endl;
    fclose(stdin);fclose(stdout);
}

void solve(){
    int day=0;
    for(int i=month1+1;i<=month2-1;++i){
        if(i==2) day+=is_run1;
        day+=months_days[i];
    }
    day+=months_days[month1]-day1;
    day+=day2;
    Print(day*24*3600+(m2-m1+((hour2-hour1)*60+mint2-mint1)*60));
}

int main(){
    freopen("two.in","r",stdin);
    freopen("two.out","w",stdout);
    scanf("%d-%d-%d %d:%d:%d",&year1,&month1,&day1,&hour1,&mint1,&m1);
    scanf("%d-%d-%d %d:%d:%d",&year2,&month2,&day2,&hour2,&mint2,&m2);
    is_run1=Judge(year1),is_run2=Judge(year2);
    if(year1==year2 && month1==month2 && day1==day2 && hour1==hour2 && mint1==mint2 && m1==m2){ printf("0"); return 0; }
    if(year1==year2 && month1==month2 && day1==day2 && hour1==hour2 && mint1==mint2 && m1!=m2){
            Print(m2-m1); return 0; }
    if(year1==year2 && month1==month2 && day1==day2 && hour1==hour2 ){
            Print(m2-m1+(mint2-mint1)*60); return 0; }
    if(year1==year2 && month1==month2 && day1==day2 ){
            Print(m2-m1+((hour2-hour1)*60+mint2-mint1)*60); return 0; }
    if(year1==year2 && month1==month2 ){
            Print(m2-m1+(((day2-day1)*24+hour2-hour1)*60+mint2-mint1)*60); return 0; }
    if(year1==year2 ){
            solve(); return 0; }
    return 0;
}

死亡

【问题描述】
现在有�个位置可以打 sif,有� + 1个人在排队等着打 sif。 现在告诉你前�
个人每个人需要多长的时间打 sif,问你第� + 1个人什么时候才能打 sif。(前�
个人必须按照顺序来)
【输入格式】
第一行两个整数�, �如上所述。
接下来�行每行一个整数代表每个人所需要用的时间。
【输出格式】
一行一个整数表示答案。
【样例输入】
3 2
1 1 1
【样例输出】
1
【样例解释】
山里有座庙。
【数据规模与约定】
对于100%的数据,每个人所需用的时间不超过105。
测试点 � � 测试点 � �
1 10 10 1 5000 500
2 20 10 2 100000 5000
3 50 10 3 100000 10000
4 1000 500 4 100000 20000
5 2000 500 5 100000 50000

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<queue>
using namespace std;
priority_queue<int> q;
inline void read(int &x){
    x=0; int f=1; char c=getchar();
    while(c>'9'||c<'0'){ if(c=='-') f=-1; c=getchar(); }
    while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } x*=f;
}
int n,m;
int main(){
    freopen("death.in","r",stdin);
    freopen("death.out","w",stdout);
    read(n),read(m);
    for(int i=1;i<=m;++i) q.push(0);
    for(int x,i=1;i<=n;++i){
        read(x);
        int tmp=q.top();tmp*= -1;
        tmp+=x,tmp*= -1;
        q.pop(),q.push(tmp);
    }
    printf("%d\n",q.top() * -1);
    fclose(stdin);fclose(stdout);
    return 0;
}
//5 2 3 7 9 4 7

凝视

【问题描述】
背包是个好东西,希望我也有。
给你一个二维的背包,它的体积是� × �。现在你有一些大小为1 × 2和1 ×
3的物品,每个物品有自己的价值。你希望往背包里面装一些物品,使得它们的
价值和最大,问最大的价值和是多少。
【输入格式】
第一行一个整数�代表该测试点的数据组数。
对于每组数据,第一行有四个整数�, �, �1, �2,其中�1, �2分别代表大小为
1 × 2和大小为1 × 3的物品个数。
接下来一行有�1个数代表每个1 × 2物品的价值。
接下来一行有�2个数代表每个1 × 3物品的价值。
【输出格式】
对于每组询问,输出能够达到的价值最大值。
【样例输入】
1
2 3 2 2
1 2
1 2
【样例输出】
4
【样例解释】
庙里有座山。
【数据规模与约定】
对于20%的数据, �, � ≤ 10, �1, �2 ≤ 100。
对于70%的数据, �, � ≤ 100,�1, �2 ≤ 2000。
对于100%的数据, 1 ≤ � ≤ 10,1 ≤ �, � ≤ 500,0 ≤ �1, �2 ≤ 10000。

有一种2*2的这样的,算起来能放一个1*3的,实际上放不了,特判一下,我就是这种情况没想到,WA一个点

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 10010
#define LL long long
int a[MAXN],b[MAXN],suma[MAXN],sumb[MAXN],n,m,n1,n2;

inline void read(int &x){
    x=0; int f=1; char c=getchar();
    while(c>'9'||c<'0'){ if(c=='-') f=-1; c=getchar(); }
    while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } x*=f;
}

inline bool cmp(int x,int y){ return x>y; }

inline LL max(LL a,LL b){ return a>b ? a : b; }

int main(){
    freopen("eyesight.in","r",stdin);
    freopen("eyesight.out","w",stdout);
    int T;
    read(T);
    while(T--){
        read(n),read(m);read(n1),read(n2);
        int sum=n*m;
        memset(suma,0,sizeof suma );memset(sumb,0,sizeof sumb );
        memset(a,0,sizeof a );memset(b,0,sizeof b );

        for(int i=1;i<=n1;++i) read(a[i]);
        for(int j=1;j<=n2;++j) read(b[j]);

        sort(a+1,a+1+n1,cmp),sort(b+1,b+n2+1,cmp);
        while(a[n1]<=0 && n1) --n1;
        while(b[n2]<=0 && n2) --n2;
        for(int i=1;i<=n1;++i) suma[i]=suma[i-1]+a[i];
        for(int i=1;i<=n2;++i) sumb[i]=sumb[i-1]+b[i];

        int numa=sum/2,numb;
        numa=min(numa,n1);
        long long ans=suma[numa];
        while(numa){
            numb=min(n2,(sum-numa*2)/3);
            ans=max(ans,(LL)sumb[numb]+suma[numa]);
            numa--;
        }
        printf("%I64d\n",ans);
    }
    fclose(stdin);fclose(stdout);
    return 0;
}
/*
1
3 5 6 6
9 12 7 -1 -2 -3
11 -4 9 -1 -2 -3
*/
//这次是自己改的标程,就是特判2的情况,比如2*2是放不进1*3的,
//而上面的代码有点bug
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 10010
#define LL long long
int a[MAXN],b[MAXN],suma[MAXN],sumb[MAXN],n,m,n1,n2;

inline void read(int &x){
    x=0; int f=1; char c=getchar();
    while(c>'9'||c<'0'){ if(c=='-') f=-1; c=getchar(); }
    while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } x*=f;
}

inline bool cmp(int x,int y){ return x>y; }

inline LL max(LL a,LL b){ return a>b ? a : b; }

int main(){
    freopen("eyesight.in","r",stdin);
    freopen("eyesight.out","w",stdout);
    int T;
    read(T);
    while(T--){
        read(n),read(m);read(n1),read(n2);
        int sum=n*m;
        memset(suma,0,sizeof suma );memset(sumb,0,sizeof sumb );
        memset(a,0,sizeof a );memset(b,0,sizeof b );

        for(int i=1;i<=n1;++i) read(a[i]);
        for(int j=1;j<=n2;++j) read(b[j]);

        sort(a+1,a+1+n1,cmp),sort(b+1,b+n2+1,cmp);
        while(a[n1]<=0 && n1) --n1;
        while(b[n2]<=0 && n2) --n2;
        for(int i=1;i<=n1;++i) suma[i]=suma[i-1]+a[i];
        for(int i=1;i<=n2;++i) sumb[i]=sumb[i-1]+b[i];
        int delta;
        if(n%3==2 && m%3==2 &&(n==2 || m==2)) delta=4;
        else delta=sum%3;
        int numa=sum/2,numb=min(n2,(sum-delta)/3);
        numa=min(numa,n1);
        long long ans=0;
        for(int i=0;i<=numb;++i)
            ans=max(ans,sumb[i]+suma[min(n1,sum-i*3>>1)]);

        printf("%I64d\n",ans);
    }
    fclose(stdin);fclose(stdout);
    return 0;
}
/*
1
3 5 6 6
9 12 7 -1 -2 -3
11 -4 9 -1 -2 -3
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七情六欲·

学生党不容易~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值