谈判专家(东方化改题+懒得看标程)
您们这些出题的都是奆佬
而我只会xjb改题,连题解都懒得看
还把奆佬们的题改的面目全非
这是原题
题目背景
小A玩《枪声与钻石》玩得很高兴,于是憧憬自己也能成为谈判专家。
题目描述
这天晚上,他做了个梦:
一个犯人突然闯进银行,持枪负隅顽抗!他必须赶赴现场去解决这件事件。
对于一个心智不太正常的犯人来说,谈判专家的工作就是安抚他们,让他们冷静,再一顿嘴炮把他们
劝回来。
这当然考验的是嘴上功夫,为此,小A一共备用了n句话,每句话会使得劝回值+w,但是犯人的愤怒值
将会+k,且每句话只能讲一次。而当犯人的愤怒值大于等于max的时候,犯人就会失了智,此时你再
讲什么他也不会听了。
但是说话是要掌握时机的!每句话都有一个时间下限x和谈话时长l,表示你只有当时间t>=x的时候才
能说这句话,而这句话说完并且起作用时会过去l时间。在此期间,不能再多说其他的话,但是你可
以在一句话起作用后的瞬间接上几句话。
默认犯人最初的愤怒值为0,默认时间从0开始。
我们的目标,就是在犯人愤怒值小于max时的劝回值最大化,如果劝回值相同,则时间消耗越少越好。
输入格式
第一行两个正整数n,max。
接下来的n行,每行四个非负整数w,k,x,l。
所有变量的含义见上文。
输出格式
输出最优解的劝回值与此时时间。
我都说了会把这题改的面目全非的
题目背景
探女参加《探女探女快说话》玩得很高兴,于是憧憬自己能成为谈判专家。
题目描述
这天晚上,她做了个梦:
正邪突然闯进辉针城,想要下克上!她必须赶赴现场去解决这件事件。
对于心智不太正常的正邪来说(我老婆的心智怎么会不正常!),探女的工作就是安(du)抚(nai)她,
让她冷静,再一顿嘴(du)炮(nai)把她劝回来。
这当然考验的是嘴(du)上(nai)功夫,为此,探女一共备用了n句话,每句话会使得劝回值+w,但是正
邪的愤怒值将会+k,且每句话只能讲一次。而当正邪的愤怒值大于等于max的时候,她就会失了智,
此时探女再讲什么她也不会听了。
但是说话是要掌握时机的!每句话都有一个时间下限x和谈话时长l,表示探女只有当时间t>=x的时候
才能说这句话,而这句话说完并且起作用时会过去l时间。在此期间,不能再多说其他的话,但是探女
可以在一句话起作用后的瞬间接上几句话。
默认正邪最初的愤怒值为0,默认时间从0开始。
探女的目标,就是在正邪愤怒值小于max时的劝回值最大化,如果劝回值相同,则时间消耗越少越好。
但是由于月都科技不发达,探女请求你帮忙。
输入格式
第一行两个正整数n,max。
接下来的n行,每行四个非负整数w,k,x,l。
所有变量的含义见上文。
输出格式
输出最优解的劝回值与此时时间。
脑补场景:
探女:我女儿最乖了
正邪:下克上不可避!(愤怒值+max)
探女:我女儿最不乖了
正邪:下克上不可避!(愤怒值+max)
这难道是传说中的爱的深黑的切吗(不
然后这道题呢我写dp写着写着把自己都绕迷糊了
(最终也不知道自己写的是不是dp)
当然dalao的标程还是要发上来的
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<cctype> 7 using namespace std; 8 typedef long long ll; 9 inline int read(){ 10 int X=0,w=0;char ch=0; 11 while(!isdigit(ch)){w|=ch=='-';ch=getchar();} 12 while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); 13 return w?-X:X; 14 } 15 struct node{ 16 ll w; 17 ll k; 18 ll x; 19 ll l; 20 }a[1001]; //啊这个结构体和我写的一模一样……连名字也一样叫node 21 bool cmp(node b,node c){ //排序√ 22 return b.x<c.x; 23 } 24 ll f[1001][50001]={0}; 25 int main(){ 26 freopen("negotiation.in","r",stdin);freopen("negotiation.out","w",stdout); 27 int n=read(); 28 ll nuqi=read(); 29 ll ans=0,maxn=0,maxx=0; 30 for(int i=1;i<=n;i++){ 31 a[i].w=read(); 32 a[i].k=read(); 33 a[i].x=read(); 34 a[i].l=read(); 35 ans+=a[i].l; 36 maxn=max(maxn,a[i].l+a[i].x); 37 maxx=max(maxx,a[i].x); 38 } 39 sort(a+1,a+n+1,cmp); 40 maxn=max(maxn,ans+maxx); 41 ll maxk=0,realt; 42 for(int i=1;i<=n;i++){ 43 for(int j=maxn;j>=a[i].x+a[i].l;j--){ 44 for(int k=nuqi;k>a[i].k;k--){ 45 f[k][j]=max(f[k][j],f[k-a[i].k][j-a[i].l]+a[i].w); 46 } 47 if(maxk<f[nuqi][j]||(maxk==f[nuqi][j]&&realt>j)){ 48 realt=j; 49 maxk=f[nuqi][j]; 50 } 51 } 52 } 53 printf("%lld %lld\n",maxk,realt); 54 return 0; 55 }
诶等等这是我什么时候写的注释……算了不管了