10.29(morning) 模拟赛


  1. 有想要数据的私我哦!(^_^)

第二题

【题目描述】

    给你两个日期,问这两个日期差了多少毫秒。

【输入格式】

两行,每行一个日期,日期格式保证为“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世纪的某一天,且第二个日期一定大于等于第一个日期。

思路

直接模拟就好了 不过要处理好闰年和平年

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
#define MAXN 30
using namespace std;
int l1,l2,mo[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int n1,y1,r1,h1,m1,s1;
int n2,y2,r2,h2,m2,s2;
int a,b,c,d;
bool ok;
ll ans;
inline void read(int&x) {
    int f=1;char c=getchar();x=0;
    while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=10*x+c-48,c=getchar();
    x*=f;
}
inline ll vb() {
    ll t=0,t1=0;
    t=h1*3600+m1*60+s1;
    t1=h2*3600+m2*60+s2;
    return t1-t;
}
inline bool pd(int x) {
    if(x%100==0&&x%400==0) return true;
    if(x%100!=0&&x%4==0) return true;
    return false;
}
inline void cb() {
    ll t1=0,t=0;
    t+=r1;
    for(int i=1;i<y1;i++) t+=mo[i];
    if(pd(n1)&&y1>2) t++;
    for(int i=2000;i<n1;i++) {
        if(pd(i)) t+=366;
        else t+=365;
    }
    t1+=r2;
    for(int i=1;i<y2;i++) t1+=mo[i];
    if(pd(n2)&&y2>2) t1++;
    for(int i=2000;i<n2;i++) {
        if(pd(i)) t1+=366;
        else t1+=365;
    }
    ans=t1-t;
    ans*=86400;
    ans+=vb();
    t1+=t;
    if(ans==0) printf("0\n");
    else cout<<ans<<"000"<<endl;
}
int main() {
    /*freopen("two.in","r",stdin);
    freopen("two.out","w",stdout);*/
    scanf("%d-%d-%d %d:%d:%d\n",&n1,&y1,&r1,&h1,&m1,&s1);
    scanf("%d-%d-%d %d:%d:%d",&n2,&y2,&r2,&h2,&m2,&s2);
    ok=true;
    if(n1!=n2||y1!=y2||r1!=r2) ok=false;
    if(ok) {
        ans=vb();
        if(ans==0) printf("0\n");
        else cout<<ans<<"000"<<endl;
    }
    else cb();
    return 0;
}

死亡

【问题描述】

现在有 个位置可以打sif,有 个人在排队等着打sif。现在告诉你前 个人每个人需要多长的时间打sif,问你第 个人什么时候才能打sif。(前 个人必须按照顺序来)

【输入格式】

第一行两个整数 如上所述。
接下来 行每行一个整数代表每个人所需要用的时间。

【输出格式】

一行一个整数表示答案。

【样例输入】

3 2
1
1
1

【样例输出】

1

【样例解释】

山里有座庙。

【数据规模与约定】

对于100%的数据,每个人所需用的时间不超过10^5
测试点  N      M    
1     10     10 
2     20     10 
3     50     10 
4     1000   500    
5     2000   500    
6     5000   500
7     100000    5000
8     100000    10000
9     100000    20000
10    100000    50000

思路

还是比较简单的
模拟加STL

代码

#include<cstdio>
#include<queue>
#include<iostream>
#define MAXN 100010
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int n,m,a[MAXN];
inline void read(int&x) {
    int f=1;char c=getchar();x=0;
    while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=10*x+c-48,c=getchar();
    x*=f;
}
int main() {
    /*freopen("death.in","r",stdin);
    freopen("death.out","w",stdout);*/
    read(n);read(m);
    for(int i=1;i<=n;i++) read(a[i]);
    for(int i=1;i<=m;i++) q.push(a[i]);
    for(int i=m+1;i<=n;i++) {
        int t=q.top();
        q.pop();
        t+=a[i];
        q.push(t);
    }
    int t=q.top();
    printf("%d\n",t);
    return 0;
}

凝视

【问题描述】

背包是个好东西,希望我也有。
给你一个二维的背包,它的体积是 。现在你有一些大小为 和 的物品,每个物品有自己的价值。你希望往背包里面装一些物品,使得它们的价值和最大,问最大的价值和是多少。

【输入格式】

第一行一个整数 代表该测试点的数据组数。
对于每组数据,第一行有四个整数 ,其中 分别代表大小为 和大小为 的物品个数。
接下来一行有 个数代表每个 物品的价值。
接下来一行有 个数代表每个 物品的价值。

【输出格式】

对于每组询问,输出能够达到的价值最大值。

【样例输入】

1
2 3 2 2
1 2
1 2

【样例输出】

4

【样例解释】

庙里有座山。

【数据规模与约定】

对于20%的数据,N,M<=10n1,n2<=100 。
对于70%的数据, N,M<=100,n1,n2<=2000。
对于100%的数据,1<=T<=10,1<=N,M<=5000,0<n1,n2<10000

思路

这题比较烧脑
竟是贪心.....
不是dp(基于连通性的状丫dp)
如果确定了选几个1*2 几个1*3就ok了
然后枚举摆几个1*3 只要个数够 一定能全放开 
然后Judge
如果只放1*2的 最多剩下一个 或者0个
先放1*3的 一样的结论 1*2的剩下1或0个
剩下的空间可以算出来
那么放几个1*2就能算出来 last/2
小小的特盘 要是2*2 不能放1*3的

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAXN 10001
using namespace std;
int n1,n2,n,m,a[MAXN],a2[MAXN];
long long tot,w[MAXN],w2[MAXN];
inline void read(int&x) {
    int f=1;x=0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
}
int main() {
    freopen("eyesight.in","r",stdin);
    freopen("eyesight.out","w",stdout);
    int t,x;
    read(t);
    while(t--) {
        tot=0;
        read(n),read(m);
        read(n1),read(n2);
        for(int i=1;i<=n1;i++) read(a[i]);
        for(int i=1;i<=n2;i++) read(a2[i]);
        sort(a+1,a+n1+1,greater<int>());
        sort(a2+1,a2+n2+1,greater<int>());
        for(int i=1;i<=n1;i++) w[i]=w[i-1]+a[i];
        for(int i=1;i<=n2;i++) w2[i]=w2[i-1]+a2[i];
        if(n>m) swap(n,m);
        if(n==2&&m%3==2) x=4;else x=0;
        for(int i=0,j;i<=n*m-x;i+=3) {
            j=n*m-i>>1;
            tot=max(tot,w[min(j,n1)]+w2[min(i/3,n2)]);
        }
        printf("%lld\n",tot);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值