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 30 12 3
2 12 4
3 43 2
4.159data 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镾 此單位由銻星人發明,後在星際旅遊業界廣泛使用 而每一艘飛船加滿燃料後...