CF846B

原题链接:Math Show

话归原题,接下来就是快乐的解题时间啦~

(博客里食用更佳)

首先,我们可以发现 nk 的数据范围都非常小,其次,每个子任务分值相同,设 dp[i] 为做了 i 个完整的任务(其余做的是单独子任务)的最多分数将 t 数组排序后暴力求解

也不多说了,剩下的注释都在代码里了~

#include<iostream>
#include<cstdio>
#include<algorithm> //sort需要的 
using namespace std;
int n,k,N,sum,ans,nim,s,t[55],a[55];//a[i]为做了i个完整的任务(其余做的事单独子任务)最多的分数 
int main(){
	cin>>n>>k>>N;
	for(int i=1; i<=k; i++){scanf("%d",&t[i]);sum+=t[i];}
	sort(t+1,t+1+k);//给t数组排序 
	for(int i=0; i<=n; i++){//暴力 
		if(sum*i>N) break;
		a[i]=i*k+i;
		nim=n-i;
		s=sum*i;
		for(int j=1; j<=k; j++){
			for(int sss=1; sss<=nim; sss++){
				s+=t[j];
				if(s>N) break; 
				a[i]++;
			}
			if(s>N) break;
		}
		ans=max(a[i],ans);//如果做了i个完整的任务最多分数比ans大,那他就是最多能挣的分数 
	}
	cout<<ans;
	return 0;
}
//P上水印
//┭┮﹏ ┭┮ 
posted @   naroto2022  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
不相信人咬不到肚脐的,咬破肚脐去死如何?