【JZOJ6350】考试(test)

news/2024/12/22 9:18:41/

description

1730624-20190917174658997-1485583005.png


analysis

  • 对于\(n=0\)的点,直接模拟就好了

  • 状压\(DP\),设\(f[i][j][S]\)表示到第\(i\)题、连续\(GG\)\(j\)题、喝的饮料集合为\(S\)的最大答案

  • 由于一题可以喝多瓶饮料所以转移需要枚举\(S\)的子集\(SS\)来转移

  • 然后转移比较显然但是细节恶心

  • 我不会告诉你我一共打了三个DP然后调出来其中一个才切的


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<iostream>
#define MAXN 105
#define MAX 500005
#define ha 19260817
#define db double
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)using namespace std;db f[MAXN][MAXN][3000],val[3000][3000];
ll x[MAX],yy[MAX],y[MAX],down[MAX],a[MAX],dif[MAX];
ll n,m,k,last;
db ans;inline ll read()
{ll x=0,f=1;char ch=getchar();while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;
}
inline db sqr(db x){return x*x;}
inline db max(db x,db y){return x>y?x:y;}
inline db min(db x,db y){return x<y?x:y;}
int main()
{freopen("T1.in","r",stdin);//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);n=read(),m=read(),k=read();fo(i,1,n)x[i]=read();fo(i,1,m)yy[i]=read();fo(i,1,k-1)down[i]=read();fo(i,1,k)a[i]=read(),y[i]=yy[read()],dif[i]=read();if (n==0){db anss=0;fo(i,1,k){db prob=a[i]*(1-sqr(max(0,1-1.0*y[i]*(last?(1.0-down[i-last]/100.0):1)/dif[i])));if (prob<0.64*a[i])last=i;anss+=prob;}printf("%.2lf\n",anss);return 0;}fo(i,0,k)fo(j,0,k)fo(l,0,(1<<n)-1)f[i][j][l]=-ha;f[0][0][(1<<n)-1]=0;fo(S,0,(1<<n)-1){for (reg SS=S;SS>=0;SS=(SS-1)&S){val[S][SS]=1.0;fo(i,1,n)if ((S&(1<<(i-1))) && (!(SS&(1<<(i-1)))))val[S][SS]*=1+x[i]/100.0;if (!SS)break;}}fo(i,1,k){fo(j,0,i){fo(S,0,(1<<n)-1)if (f[i-1][j][S]>=0){for (reg SS=S;SS>=0;SS=(SS-1)&S){db pro=val[S][SS];if (j){db tmp=a[i]*(1-sqr(max(0,1-1.0*(y[i]*pro*(1-down[j]/100.0))/dif[i])));if (tmp>=0.64*a[i])f[i][j+1][SS]=max(f[i][j+1][SS],f[i-1][j][S]+tmp);else f[i][1][SS]=max(f[i][1][SS],f[i-1][j][S]+tmp);}else{db tmp=a[i]*(1-sqr(max(0,1-1.0*(y[i]*pro)/dif[i])));if (tmp>=0.64*a[i])f[i][0][SS]=max(f[i][0][SS],f[i-1][0][S]+tmp);else f[i][1][SS]=max(f[i][1][SS],f[i-1][0][S]+tmp);}if (!SS)break;}}}}fo(i,0,k)fo(j,0,(1<<n)-1)ans=max(ans,f[k][i][j]);printf("%.2lf\n",ans);return 0;
}

转载于:https://www.cnblogs.com/horizonwd/p/11535777.html


http://www.ppmy.cn/news/172596.html

相关文章

Always Online hdu 6350

ps&#xff1a;今天真是石乐志&#xff0c;改了一下午bug&#xff0c;结果是忘了排序。。。。。。。。。。这题姿势较多&#xff0c;坑点就一个。 题解&#xff1a;有个结论&#xff0c;任意两点之间如果至多存在两条不相交路径&#xff0c;那么每一条边至多出现在一个环中&…

快狗打车开启招股:奇瑞、广发为基石,二者合计认购6350万美元

6月14日&#xff0c;快狗打车&#xff08;HK:02246&#xff09;在港交所发布公告&#xff0c;拟全球发售3120万股股份&#xff0c;其中香港发售股份312万股&#xff0c;国际发售股份2808万股&#xff0c;另有15%超额配股权。发售价将为每股发售股份21.5港元&#xff0c;预期股份…

hdu6350 /// tarjan+并查集+组合+最大流思想

题目大意&#xff1a; 给定n个点 m条边没有重边的仙人掌图&#xff08;没有一条边会同时存在与两个环 也就是环都是相互独立的&#xff09; 求任意两点间 i^j^maxflow(i,j)的总和 maxflow为两点间最大流 题解&#xff1a;https://blog.csdn.net/du_lun/article/details/8161062…

hdu - 6350

Topic 题目链接 Always Online Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 208 Accepted Submission(s): 66 Problem Description Wayne is an administrator of some metropolitan area network. The n…

HDU 6350 Always Online——仙人掌图

思路&#xff1a;把每个环的最小边去掉&#xff0c;加在环的其他边上&#xff0c;然后并查集跑一下就可以&#xff0c;跑的时候维护一下某位为1的点有多少个 #include <cstdio> #include <vector> #include <iostream> #include <algorithm> u…

HDU 6350 Always Online (仙人掌图,最大流)

传送门 这道题真的是坑&#xff0c;竟然用ull&#xff0c;ll都会爆。 首先这是一个仙人掌图。题意让求任意两点最大流&#xff0c;再进行异或。先说最大流&#xff0c;对于环上任意两点最大流&#xff0c;就是两条路径最小的边和&#xff0c;这就等效于求出环中最小的边&…

MTK Android5.1 单独调整主副麦的模拟增益PGA(MT6350_PMIC)

MTK Android5.1 单独调整主副麦的模拟增益PGA&#xff08;MT6350_PMIC&#xff09; 项目使用副麦消噪&#xff0c;但是副麦增益太小&#xff0c;需要单独修改副麦增益&#xff0c;使用工程模式APP和Audio Tuning Tool调整的MIC的Level4的值&#xff0c;都会同时调整主麦和副麦…

HDU 6350 Always Online(最大流+并查集)

Description 给出一个 n n 个点m" role="presentation" style="position: relative;">mm条边的无向图&#xff0c;任意两点之间至多两条路径&#xff0c;以 flow(s,t) f l o w ( s , t ) 表示 s,t s , t 两点之间的最大流&#xff0c;求 ∑1≤s&l…