列表

详情


NC15724. 小Q的口袋校园

描述

周末,小Q喜欢在PU口袋校园上参加各种活动刷绩点,体验丰富多彩的大学生活。
但是每个活动有各自的开始时间、结束时间、Happy值以及绩点数,活动之间可能存在时间冲突。
小Q是一个认真踏实的女孩,她在同一时间只会参加一个活动。
给出每一天的活动数,求小Q在同一天内所能获得的最大Happy值 与 绩点数。
小Q是一个活泼开朗的女孩,她总是寻求最大的Happy值,如果Happy值相同,才会尽可能使绩点数更多。

输入描述

第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例第一行输入一个整数N(表示有几项活动)
接下来N行,每行输入s,e,h,p 4个整数,分别代表一个活动的开始时间、结束时间、Happy值以及绩点数
0<=s<e<=24,1<=h,p<=100,1<=T,N<=20

输出描述

输出T行
一行输出一个样例对应的结果
小Q在一天内所能获得的最大 Happy值 与 绩点数

示例1

输入:

1
4
1 3 1 1
2 5 2 1
3 7 2 1
5 8 1 2

输出:

3 3

说明:

有两种方案
1)选择 第1、3两个活动,可以获得 Happy值 3 和 绩点数 2;
2)选择 第2、4两个活动,可以获得 Happy值 3 和 绩点数 3.

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 328K, 提交时间: 2018-06-07 09:57:03

#include<iostream>
#include<cstring>
using namespace std;

int n,a[30][2],v[30][2],visit[30],cnth,cntp;

void dfs(int now,int h,int p)
{
	if(h>cnth)
	{
		cnth=h;
		cntp=p;
	}
	else if(h==cnth)
	{
		if(p>cntp)
		{
			cnth=h;
			cntp=p;
		}
	}
	for(int i=0;i<n;i++)
	{
		if(!visit[i]&&a[i][0]>=now&&a[i][1]<=24)
		{
			visit[i]=true;
			dfs(a[i][1],h+v[i][0],p+v[i][1]);
			visit[i]=false;
		}
	}
}

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		memset(visit,false,sizeof(visit));
		cin>>n;
		for(int i=0;i<n;i++)cin>>a[i][0]>>a[i][1]>>v[i][0]>>v[i][1];
		cnth=-1;
		cntp=-1;
		dfs(0,0,0);
		cout<<cnth<<" "<<cntp<<endl;
	}
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 376K, 提交时间: 2023-03-23 12:14:15

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,r,v,y;
}a[30];
int n,t,ans1,ans2;
void dfs(int t,int v,int y)
{
	if(v>ans1||(v==ans1&&y>ans2))ans1=v,ans2=y;
	for(int i=0;i<n;i++)if(a[i].l>=t)dfs(a[i].r,v+a[i].v,y+a[i].y);
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		ans1=ans2=0;
		scanf("%d",&n);
		for(int i=0;i<n;i++)scanf("%d%d%d%d",&a[i].l,&a[i].r,&a[i].v,&a[i].y);
		dfs(0,0,0);
		cout<<ans1<<" "<<ans2<<endl;
	}
	return 0;
}

上一题