4245 五校聯考6day2 er

2021-09-10 08:58:17 字數 3709 閱讀 2860

time limits: 1000 ms  memory limits: 262144 kb  detailed limits  

第一行3 個正整數n;m;k, 含義見題面。

第二行n 個正整數ai,表示他的每個裝備的初始威力值。

第三行開始共m 行,每行兩個正整數type_i;ci,描述乙個強化符文。type_i表示符文型別,1 表示賦值,2 表示加法,3 表示乘法。ci 是對應的常數值。

乙個數,表示最大的總效果值。由於這個數可能很大,請輸出它的自然對數,保留3 位小數。

2 5 3

0 12 3

2 12 4

3 43 2

4.159
data constraint

對於20% 的資料,n = 1;

對於全部資料m,k ≤ 100;n ≤ 2,最多乙個type_i = 1。

輸入資料中所有數不超過2000。

source / author: 谷晟 er

本來沒看到n<=2,以為n<=100,但考場仍打了乙個n^3程式,以為穩穩過。

結果不遂。

當時的思路:

顯然,我們先將加法操作,乘法操作分別存在兩個陣列裡,然後排降序。

對於賦值操作,若是在加完乘完後賦值,顯然對答案沒有意義。

對於乘法操作,注意到最終的答案是乘積,因此給誰乘對答案沒影響。

那我們可以列舉加法操作。

i列舉用幾個加法操作。

至於這i個加給誰,我想到當a+b = c+d 兩個更接近的乘積更大。

例子:2*5 = 10,3*4 =12

顯然後者兩個挨得更近,乘積更大。

於是我就想辦法讓小的變大,具體地,將當前要加上的值給最小的a。

最小值用set維護一下,找最小的時間就接近常數了。

然後把得到的答案存進f裡,f[i]表示已經用了i次機會的最大乘積。

最後列舉乙個用乘的個數,配合f算答案。

具體見80分程式:(考場50分,後來改了點細節就80了)

#include#define n 210

#define inf 2147483647

#define rint register ll

#define ll long long

#define point(a) multiset::iterator

#define mod (ll)(998244353)

#define mem(a,b) memset(a,b,sizeof (a))

#define mcy(a,b) memcpy((a) , (b) ,sizeof (a));

#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);

using namespace std;

struct node

};int n,m,k,i,j,l;

int sk[n][2],t1[n],t2[n],t3[n],a[n],t[n];

long double f[n],pre[n],ans,tmp;

multisets;

bool cmp(int a,int b)

int main()

sort(t2+1,t2+1+t2[0],cmp);

sort(t3+1,t3+1+t3[0],cmp);

for(i=1;i<=t3[0];i++)pre[i] = pre[i-1] + log(t3[i]);

//使用賦值強化

mcy(t,a);

if(t1[0])

);

tmp=0;

for(j=1;j<=n;j++)tmp+=log(a[j]);

f[1] = max(f[1] , tmp); //不加法

for(j=1;j<=t2[0];j++)

if(1+j<=k)

);long double sum=0.0;

for(l=1;l<=n;l++)sum = sum + log(a[l]);

f[1+j] = max(f[1+j] , sum);

}mcy(a,t);

} }//不使用

s.clear();

tmp=0;

for(j=1;j<=n;j++)s.insert((node)),tmp+=log(a[j]);

f[0] = max(f[0] , tmp);

for(j=1;j<=t2[0];j++)

if(j<=k)

); long double sum=0.0;

for(l=1;l<=n;l++)sum = sum + log(a[l]);

f[j] = max(f[j] , sum);

} else break;

mcy(a,t);

for(i=0;i<=t3[0];i++)if(k-i >= 0)

ans = max(ans , f[k-i] + pre[i]);

printf("%.3lf\n",(double)ans);

return 0;

}

是不是看起來很蠢。

總而言之,這種貪心思想是錯的,有待證明,希望讀者能幫著摳摳錯誤,程式上的也可以。

ac做法:

排序加和乘操作,算字首和,字首積。

分別討論n==1,和n==2的答案.

n==1顯然。

n==2我們先要做一做dp

f[i][j] 表示 用了前i個加法操作,a[1]=j 時,a[2]的最大值。

轉移顯然。

然後列舉i,列舉j,i,j的意思就是f兩個緯度分別代表的意思。

當然,以上討論避開了自然對數的問題。

注意賦值操作的神奇性。

#include#define n 110

#define q 200000

#define inf 2147483647

#define rint register ll

#define ll long long

#define lb long double

#define point(a) multiset::iterator

#define mod (ll)(998244353)

#define mem(a,b) memset(a,b,sizeof (a))

#define mcy(a,b) memcpy((a) , (b) ,sizeof (a));

#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);

using namespace std;

int n,m,k,i,j,tl;

int opt,cst ,m2,m3;

int fff,t2[n],t3[n],sum[n],f[n][n*2000],a[3];

lb ans,pro[n];

bool cmp(int a,int b)

void init()

void dp()

return ;

}int main()

init(); //sum , pro

if(n==1) }

printf("%.3lf",(double)ans);

return 0;

}

t2[i]是加第i個加法操作的權值。

五校聯考6day2 er

description 小明在業餘時間喜歡打電子遊戲,不是星際和魔獸這些,是賽爾號一類的遊戲。最近小明在玩一款新出的遊戲,叫做 小明覺得遊戲裡自己的裝備太垃圾了,每次都被大神虐,一怒之下充了 元準備強化裝備。這個遊戲中用於強化裝備的道具叫做強化符文。有以下3 種 賦值強化符文,對某個裝備使用這個符文...

五校聯考6day2 san

description 小明經常去n 個地點,其中有些地點之間有直接的無向道路 共m 條這樣的道路 可以直接互相到達,這些道路的長短不一。由於小明對這些道路都很熟悉,無論起點和終點在 總能走最短路。小明有嚴重的強迫症,認為奇數很不和諧,如果他某一天從乙個地點去另乙個地點走過的路程是奇數,就會很不爽,...

4244 五校聯考6day2 yi

小明是 星際旅遊公司的員工,負責安排飛船,有n 艘飛船由他管理,每艘飛船能容納的人數都不同。今天小明被要求為乙個去銻星的旅遊團安排往返的飛船,旅遊團有m人,小明希望用最少的飛船完成任務。但不是所有的飛船都能用的,地球和銻星距離k镾 此單位由銻星人發明,後在星際旅遊業界廣泛使用 而每一艘飛船加滿燃料後...