洛谷水题 P1167刷题

题目简单,直接贪心,处理数据麻烦点

题目描述

noip临近了,小A却发现他已经不会写题了。好在现在离竞赛还有一段时间,小A决定从现在开始夜以继日地刷题。也就是说小A废寝忘食,一天二十四小时地刷题。

今天的日期(时间)是yyyy年mm月dd日hh时min分,考试的时间是yyyy'年mm'月dd'日hh'时min'分。这之间的所有时间小A都用来刷题了,那么考试之前他最多能刷多少题呢?注意哦,考虑闰年。

时间紧张小A只管数量不管质量。当然有的题目容易一些,有的题目难一些。根据小A的经验,他能一眼看出写出某一个题目需要的时间,以分钟记。

现在给出洛谷Online Judge的题目列表,请你挑出最多的题目使小A能在竞赛前写出来。

我们假设从远古到未来,历法的表示与现在一样。

输入输出格式

输入格式:

第一行一个整数N,表示洛谷Online Judge的题目数,N≤5000。

接下来N行,每行一个整数表示刷该题需要用的时间,以分钟记,小于等于10000。(这个题本身是什么并不重要,不是么?小A已经写过题目数为0个)。

接下来两行依次是当前时间和竞赛时间。时间给出的格式是:yyyy-mm-dd-hh:min,例如:2007-06-23-02:00,采用24小时制,每天从00:00~23:59,年份从0000到9999。

输出格式:

一行,一个整数,noip前最多刷的题目数。

输入输出样例

输入样例#1:
2
1
1
2007-06-23-11:59
2007-06-23-12:00
输出样例#1:
1


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int a[5010];
int year=365;
int yearr=366;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 
int monthr[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年 
int year1,month1,day1,hour1,min1;
int year2,month2,day2,hour2,min2;
ll time1,time2;
void read(){
	scanf("%lld-%lld-%lld-%lld:%lld",&year1,&month1,&day1,&hour1,&min1);
    scanf("%lld-%lld-%lld-%lld:%lld",&year2,&month2,&day2,&hour2,&min2);
}	
int pd(int x){
	if(((x%4==0)&&(x%100!=0))||((x%100==0)&&(x%400==0)))
		return 1;//闰年
	else
		return 0;
}
ll work1(){//转换为分钟 
	int flag1=pd(year1);
	for(int i=0;i<year1;i++)
		if(pd(i))time1+=yearr*24*60;
		else time1+=year*24*60;
	ll monthtime=0;
	for(int i=month1-1;i>=0;i--)
		if(flag1)monthtime=monthtime+monthr[i]*24*60;
		else monthtime=monthtime+month[i]*24*60;
	time1+=min1+hour1*60+(day1-1)*24*60+monthtime;
	return time1;
}
ll work2(){//转换为分钟
	int flag2=pd(year2);
	for(int i=0;i<year2;i++)
		if(pd(i))time2+=yearr*24*60;
		else time2+=year*24*60;
	ll monthtime=0;
	for(int i=month2-1;i>=0;i--)
		if(flag2)monthtime=monthtime+monthr[i]*24*60;
		else monthtime=monthtime+month[i]*24*60;
	time2+=min2+hour2*60+(day2-1)*24*60+monthtime;
	return time2;
}
ll work(){//分钟相减 
	return work2()-work1();;
}
int main(){
	int i,j,k,m,n;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	read();
	ll ans=work();
	int tmp=0;
	for(i=1;i<=n;i++){
		if(ans-a[i]>=0){
			tmp++;
			ans-=a[i];
		}
	}
	printf("%d\n",tmp);
	return 0;
}


洛谷P2791是一道关于幼儿园篮球的题目。题目描述如下: 在幼儿园里,小朋友们正在进行篮球比赛。每个小朋友都有一个篮球,他们按照顺序依次投篮。每个小朋友投篮时,可以选择将篮球投给左边的小朋友或者右边的小朋友。每个小朋友投篮得分的规则如下: 1. 如果一个小朋友左右两边的小朋友都没有投篮过,那么他的得分为1; 2. 如果一个小朋友左边的小朋友投篮过,但右边的小朋友没有投篮过,那么他的得分为左边小朋友的得分加1; 3. 如果一个小朋友右边的小朋友投篮过,但左边的小朋友没有投篮过,那么他的得分为右边小朋友的得分加1; 4. 如果一个小朋友左右两边的小朋友都投篮过,那么他的得分为左边小朋友和右边小朋友得分的最大值加1。 现在给定每个小朋友投篮的顺序,请你计算每个小朋友的得分。 例如,给定投篮顺序为[1, 0, 1, 0, 1],则第一个小朋友的得分为1,第二个小朋友的得分为2,第三个小朋友的得分为1,第四个小朋友的得分为2,第五个小朋友的得分为1。 你可以通过编写程序来解决这个问题。具体的解题思路可以参考以下步骤: 1. 创建一个数组scores,用来存储每个小朋友的得分; 2. 遍历投篮顺序数组,对于每个小朋友,根据上述规则计算他的得分,并将得分存入scores数组中; 3. 最后输出scores数组即可。 希望以上解答对你有帮助!如果你还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值