[グループ] [NOIP2019 JZOJ Aシミュレーション2019年9月11日]試験(テスト)

タイトル

[問題の説明]
試験を見るために小さなS、試験K道路タイトルの合計。各質問には、得点??、ZI難しさと持ち
型SIを。これらのトピックは、m個の異なるタイプの合計です。
小さなS深刻な側枝のためには、それは問題のi番目のタイプのトピック能力の種類ごとに異なるかもしれ
YIとしてプロジェクトの習熟度。
問題を単純化するために、我々は小さなS yを能力は対象のZスコアの難易度をやってたときに、と信じている
2 -最大-スコア⋅(?? 1)受信します (0,1)。
我々はすべて知っているように、考え方に影響を与え、よくプレイしてもよい質問、我々は小さなS場合とは考えていない
スコアのタイトル・トラックの64%未満のスコアは、次の質問には熟練を行うが低下します。具体的には、次
のiドロップの質問、技能のCI%。各質問のインパクトの前に64%以下の前回のスコアが低下します。
質問のトンスコア64%未満が、その後、T + I能力の質問は、CIの%を減少するうち場合(つまり、である。
同時に、複数の質問が64%未満の端数が外に存在する場合、最後の意志影響を受ける。例えば、第一のサブタイトル
番号は、次に3(すなわち、1 + 2)表題ドロップC2の%未満の64%、4及び5未満の64%、次いで最初に次の質問がある(すなわち、4 + 1)
の問題が落ちますC1%。)
本明細書によれば、各質問の小Sスコアを決定することが可能でした。しかし、少しS nはボトルの神が存在する
奇妙な飲み物は、私が質問を行う上でのドリンクボトルの飲み物は、問題のXI%を解決する能力を向上させるために行うことができます。唯一のドリンクボトル
ドリンクへの質問では、ドリンクボトル飲料は、質問を行うことができます。
落下と上昇の能力は、順番に各時刻が現在の割合に応じて計算されています。簡単に言えば、それは、
元の高技能1±U%。
今、私たちは最高の合計スコアが小さいSの数である尋ねます
[入力形式が
test.in.入力ファイルから読み取ります
三つの整数N、M、Kの最初の行は、各数値は、飲料のボトルの数、被写体や質問の数の種類を表します。
二行目のn整数X1、X2は、⋯、??、もたらすために飲料のリフトを示す
Y1 ,? 2の整数第m行を、⋯、?? 、 各被験者のために熟練の種類を表します。
第四線k - 1つの整数のC1、C2は、⋯、CK- 1、 タイトル直後うまく行かない熟練度の低下を表しています。
三つの整数AI、SI、ZI表すスコア、および難しい被写体の種類の次のk行。
[出力形式]
で、ファイルへの出力test.outに。
出力は実数、答えを並べます。2小数点以下の桁数出力に丸めました。
サンプル入力[1]
1 1 2
10
100
50
100 260 1
100 1〜200である
[サンプル1]出力
2019非プロフェッショナルレベルのソフトウェア認証機能は、ステージ(第2ラウンド)は、第2の認証テスト(テスト)ページを増やす3合計8
141.72
[解説]サンプル1
総飲料ボトル、あなたは最初の質問または2番目の質問をしている時に飲むように選択することができます。
:2番目の質問は、ドリンクを行う場合
(1 -最初のタイトル100、100×(1のスコアを行う能力を-
100
260)2)22 = 62であり、
169
64以下のスコアが第2の容量が50%減少する、及び飲料は10%増加することができるので、
100の実際の容量×50%×110%= 55。
2番目の質問を100×採点される(1 - (1 -
55
200)2)= 47 7
16。
1535個の109個の合計スコア
2704ポイント。
同様に最初の質問を行うことは獲得したときに選択した飲み物で141121になるように計算することができます
169
ポイント、最高得点
141 121
169分。
[サンプル2]は
、ディレクトリ/ test2.inおよびテスト/ test2.ans下のテストプレーヤーを参照してください。

[データ]の範囲
、0≤N≤10,1≤SI≤確保するためのテストポイントの100%に ?? 1≤?? - ? - 2≤⋯≤1≤10,1≤≤5×105、0≤? ≤100,1≤??、??、?? ≤105、1≤??≤1000

思考

圧力DPおよびDPのような問題の意味

この質問に長いと件名を退屈、詳細とより、少しリング真が、それは私のような破裂することに注意してください0

コード

#include<bits/stdc++.h>
using namespace std;
const int N=27,maxK=5e5+77;
int n;
double x[N];
int m,y[N];
int K,a[maxK],s[maxK],z[maxK];
double c[maxK];
inline double sqr(double x){return x*x;}
double pro[1<<10],f[110][110][1<<10];
inline void update(double &x,double y){y>x?x=y:0;}
int main()
{
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	scanf("%d%d%d",&n,&m,&K);
	for(int i=0; i<n; i++)
		scanf("%lf",&x[i]),x[i]=(100+x[i])/100;
	for(int i=1; i<=m; i++)
		scanf("%d",&y[i]);
	for(int i=1; i<K; i++)
		scanf("%lf",&c[i]),c[i]=(100-c[i])/100;
	for(int i=1; i<=K; i++)
		scanf("%d%d%d",&a[i],&s[i],&z[i]);
	if(n==0){
		double ans=0;
		for(int i=1,lst=0; i<=K; i++)
		{
			double p=y[s[i]]*(lst?c[i-lst]:1),sco=a[i]*(1-sqr(max(0.0,1-p/z[i])));
			ans+=sco;
			if(sco<a[i]*0.64)
				lst=i;
		}
		printf("%.2lf\n",ans);
		return 0;
	}
	pro[0]=1;
	for(int i=1; i<1<<n; i++)
		for(int j=0; j<n; j++)
			if(i>>j&1)
			{
				pro[i]=pro[i^1<<j]*x[j];
				break;
			}
	memset(f,128,sizeof f);
	f[0][0][0]=0;
	for(int i=0; i<K; i++)
		for(int j=0; j<=i; j++)
			for(int s1=0;s1<1<<n;++s1)
				if(f[i][j][s1]>=0)
					for(int s2=s1;s2<1<<n;s2=(s2+1)|s1)
					{
						double p=y[s[i+1]]*(j?c[i+1-j]:1)*pro[s2^s1];
						double sco=a[i+1]*(1-sqr(max(0.0,1-p/z[i+1])));
						if(a[i+1]*0.64-sco>0)
							update(f[i+1][i+1][s2],f[i][j][s1]+sco);
						else
							update(f[i+1][j][s2],f[i][j][s1]+sco);
					}
	double ans=0;
	for(int j=0; j<=K; j++)
		for(int s1=0;s1<1<<n;s1++)
			ans=max(ans,f[K][j][s1]);
	printf("%.2lf\n",ans);
	return 0;
}
703元記事公開 ウォンの賞賛392 ビューに14万+を

おすすめ

転載: blog.csdn.net/Eric1561759334/article/details/100785463