• 板块P1833 樱花
  • 楼主KEBrantily
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/11/11 21:20
  • 上次更新2023/11/5 08:15:27
查看原帖
281497
KEBrantily楼主2020/11/11 21:20

三个点 WA

long long 没必要开数组也开大了但是懒得改了

我不管我就是不想用进制优化

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define maxn 1000010
#define int long long

using namespace std;

char s;
int times,n;
int hh1,hh2,mm1,mm2;
int c[maxn],w[maxn],p[maxn];
int f[maxn];
int ans; 

int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0' ||ch>'9'){
		if(ch=='-') w=-1;
		ch=getchar();
	} 
	while(ch>='0' &&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	return s*w;
}

void Pack01(int cos,int wei){
	for(int i=times;i>=cos;i--)
		f[i]=max(f[i],f[i-cos]+wei);
} 

void PackCom(int cos,int wei){
	for(int i=cos;i<=times;i++)
		f[i]=max(f[i],f[i-cos]+wei);
}

void PackH(int cos,int wei,int cnt){
	if(cos*cnt>=times){
		PackCom(cos,wei);
		return;
	}
	int k=1;
	while(k<cnt){
		Pack01(k*cos,k*wei);
		cnt-=k;
		k*=2;
	}
	Pack01(cos,wei);
}

signed main(){
	cin>>hh1>>s>>mm1;
	cin>>hh2>>s>>mm2;
	n=read(); 
	
	times=60*(hh2-hh1)+mm2-mm1;
	
    memset(f,-1,sizeof f); 
    f[0]=0;
    
	for(int i=1;i<=n;i++){
		c[i]=read();w[i]=read();p[i]=read();
		if(p[i]==0) PackCom(c[i],w[i]);
		else PackH(c[i],w[i],p[i]);   
	}
	
	for(int i=1;i<=times;i++)ans=max(ans,f[i]); 
	printf("%lld",ans);
	return 0;
} 
2020/11/11 21:20
加载中...