问题 G: 背菜谱
Posted lipu123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题 G: 背菜谱相关的知识,希望对你有一定的参考价值。
题目描述
扬州是中国四大菜系之一的淮扬菜系的发源地。中午,跑男们来到扬州菜根香饭店,这是家很有名的老字号,有着正宗的淮扬菜。狮子头不松不紧、蟹粉味很浓,扬州炒饭配料丰富,米粒颗颗饱满,煮干丝入口即化、汤头也很鲜……
不过吃饭前,他们还必须完成一项比赛——背菜谱,每人都有一本饭店的菜谱,在规定的时间看谁记住的菜名多。Angelababy发现菜谱中有的菜名字多一些,有的字少一些,多的菜名难背一点,少的菜名好背一点,根据Angelababy的经验,她能一眼看出背一个菜名需要的时间,以分钟记。
开始背菜谱的时间是yyyy年mm月dd日hh时min分,开始测试的时间是yyyy‘年mm‘月dd‘日hh‘时min‘分。那么测试之前她最多能背多少个菜名呢?
不过吃饭前,他们还必须完成一项比赛——背菜谱,每人都有一本饭店的菜谱,在规定的时间看谁记住的菜名多。Angelababy发现菜谱中有的菜名字多一些,有的字少一些,多的菜名难背一点,少的菜名好背一点,根据Angelababy的经验,她能一眼看出背一个菜名需要的时间,以分钟记。
开始背菜谱的时间是yyyy年mm月dd日hh时min分,开始测试的时间是yyyy‘年mm‘月dd‘日hh‘时min‘分。那么测试之前她最多能背多少个菜名呢?
输入
第一行一个整数n,表示字典中的单词数,n≤5000。
接下来n行,每行一个整数表示背这个单词需要用的时间,以分钟记,小于等于10000。
接下来两行依次是开始背菜谱的时间和开始测试时间。
接下来n行,每行一个整数表示背这个单词需要用的时间,以分钟记,小于等于10000。
接下来两行依次是开始背菜谱的时间和开始测试时间。
输出
输出共一行,包含一个整数,测试前最多能背出的菜名数。
样例输入 Copy
2
1
1
2007-06-23-11:59
2007-06-23-12:00
样例输出 Copy
1
提示
对于100%的数据,1≤n≤5000。
时间给出的格式是:yyyy-mm-dd-hh:min,例如:2007-06-23-02:00,采用24小时制,每天从00:00~23:59,年份从0000到9999。
时间给出的格式是:yyyy-mm-dd-hh:min,例如:2007-06-23-02:00,采用24小时制,每天从00:00~23:59,年份从0000到9999。
#include<cstdio> #include<iostream> #include<algorithm> #include<map> #include<string> #include <math.h> #include<memory.h> #include<cstring> using namespace std; using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } const int INF=0x3f3f3f3f; const int maxn=1e5+10; int n; int v[maxn]; int check(int x) //判断是否是闰年 { if(x%400==0)return true; if(x%100==0)return false; if(x%4==0)return true; return false; } int num[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //平年每月的天数 ll ddd(int y,int m,int d) { y--; ll ret=365ll*y+y/4-y/100+y/400+d; for(int i=1;i<m;i++) { ret+=num[i]; if(i==2&&check(y+1))ret++; } return ret; } void inint(){ cin>>n; for(int i=1;i<=n;i++){ cin>>v[i]; } sort(v+1,v+n+1); } int main(){ inint(); char a[100]; int y1,y2,m1,m2,d1,d2,k1,k2,z1,z2; // char t1,t2,t3,t4 // scanf("%4d%c%2d%c%2d%c%2d%2d%c%2d",&y1,&t1,&m1,&t2,&d1,&t3,&k1,&t4,&z1); // cout<<"fjsf"<<endl; // getchar(); // scanf("%4d%c%2d%c%2d%c%2d%2d%c%2d",&y2,&t1,&m2,&t2,&d2,&t3,&k2,&t4,&z2); scanf("%s",a); y1=(a[0]-0)*1000+(a[1]-‘0‘)*100+(a[2]-‘0‘)*10+(a[3]-‘0‘); m1=(a[5]-‘0‘)*10+(a[6]-‘0‘); d1=(a[8]-‘0‘)*10+(a[9]-‘0‘); k1=(a[11]-‘0‘)*10+(a[12]-‘0‘); z1=(a[14]-‘0‘)*10+(a[15]-‘0‘); scanf("%s",a); y2=(a[0]-0)*1000+(a[1]-‘0‘)*100+(a[2]-‘0‘)*10+(a[3]-‘0‘); m2=(a[5]-‘0‘)*10+(a[6]-‘0‘); d2=(a[8]-‘0‘)*10+(a[9]-‘0‘); k2=(a[11]-‘0‘)*10+(a[12]-‘0‘); z2=(a[14]-‘0‘)*10+(a[15]-‘0‘); ll sum1=k1*60+z1; ll sum2=k2*60+z2; ll ans1=ddd(y1,m1,d1); ll ans2=ddd(y2,m2,d2); ll ans=ans2-ans1; ans=ans*24*60; ans=ans+(sum2-sum1); int p=0; for(int i=1;i<=n;i++){ if(ans>=v[i]){ ans-=v[i]; p++; } else{ break; } } cout<<p<<endl; }
以上是关于问题 G: 背菜谱的主要内容,如果未能解决你的问题,请参考以下文章