MZOJ 2018 03 31 考試隨想

2022-05-16 01:36:07 字數 3711 閱讀 7583

第一道題,先是題看錯了,貪心的時候沒有貪心對,改了1mol,最後才改對,預計正常用時20min。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

const

int maxn=10000+10;9

const

long

long mods=1000000009;10

11int

n;12

long

long t=0;13

long

long ans=0;14

15struct

nodepeo[maxn];

1819

bool

cmp(node a,node b)

2023

24void

readdate()

2534 sort(peo+1,peo+1+n,cmp);

35return;36

}3738void

work()

3944 cout4647

intmain()

48

第二道題也十分簡單,不就是乙個普通的加減值問題嗎?

但是,我首先想到的是用公式

設g1為大於答案值的個數,g2是小於答案值的個數,s1是大於答案的每個數的總和,s2是小於答案的每個數的總和。同時,答案為x,能量損失為a。

則有:(s1-h1*x)*a = h2*x - s2

樣例過了,但是好像有精度上的問題。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

const

int maxn=10000+10;9

10int

n,k;

11int

shu[maxn];

12int

sum;

13int

sum1,sum2;

14int

g1,g2;

15double

pin,ans;

1617

void

readdate()

1825 sort(shu+1,shu+n+1

);26 pin = (sum*1.0) / (n*1.0

);  //我們可以輕易證得,答案 < 所有數加起來的平均數,(因為有能量損失)

27for(int i=1;i<=n;i++)

2834

else

3539}40

return;41

}4243void

work()

4449

50int

main()

51

其次,我才想到了二分答案。

首先讀入每個數,在讀的時候要特判,如果讀進去的數都是一樣的,或者n==1,即只有乙個值,那我們就可以直接輸出了。

然後讀完了所有數後,要進行sort排序,我是按照從大到小排序的,講二分的 l 設為數列裡最小的,r 設為最大的。因為是double型,有精度問題,所以while迴圈的條件就是(r-l)> 10-12 ,然後就是常規取mid了。這個地方,check的條件也是十分明顯的。首先把所有大於mid的數加起來(因為精度問題,也需要用(a-mid)> 10-12 來判斷大小),然後每次乙個比它小的數,就從sum中減去,如果不夠了,就說明我們列舉的ans大了,這時候就r=mid,否則這個方案就是可行的,l=mid(同時我習慣於在這一步就把答案更新為l)。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

const

int maxn=10000+10;9

10int

n,k;

11double

shu[maxn];

12double

l,r,mid;

13double

ans;

14bool

flag;

1516

bool cmp(double x,double

y)17

2021

void

readdate()

2230

if(!flag || n==1

)  //特判

3135 sort(shu+1,shu+1+n,cmp);

36 l=shu[n];

37 r=shu[1

];38}39

40bool check(double

now)

4149

else

5056

else

5760}61

}62return

true;63

}6465void

work()

6675

else

7679

}80 printf("

%.9f\n

",ans);81}

8283

intmain()

84

第三道題,很明顯的乙個最長上公升子串行嘛。注意的條件不就是要判斷兩個相鄰值之間項數差值是否大於d,以及注意資料範圍,用nlogn的方法求最長上公升子串行就可以了。我用的是之前在一道題解裡看到過得求上公升子串行的方法,正好有乙個q的陣列可以來判斷d的關係。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

const

int maxn=100000+10;9

10int

n,d,tot;

11int

q[maxn];

12int

c[maxn];

13int

s[maxn];

1415

intmain()

1625

for(int i=1;i<=n;i++)

2634 cout36return0;

37 }

至於第四道題嘛,洛谷上的大佬都講得很清楚了,乙個狀壓dp。

1 #include2 #include3 #include4

using

namespace

std;56

int floors[5200][15];7

int f[5200];8

int maps[15][15];9

intn,m,st,en,va;

10int ans=0x3f3f3f;11

12void

clear()

1317

18void work(int

k)1938}

39 ans=min(ans,f[n-1

]); 40}

4142

intmain()

4352

for(int i=0;i)

5357 cout58return0;

59 }

MZOJ 1063 士兵守衛

bob特別喜歡戰略遊戲,但有時他不能盡快找到最優解,所以他就很傷心。現在他又有乙個問題,他必須保衛乙個中世紀的城市,這個城市的道路形成了一棵樹。他需要在樹的節點上放最少的士兵來觀察所有的邊。你能幫助他麼?例如下圖就只需要乙個士兵放在1號節點。輸入檔案中有多組資料,每組資料的第一行n表示點的個數。接下...

MZOJ2007 路燈的改建計畫

問題描述 一天晚上,我們資訊學競賽班的sfj 同學正往校門外走,忽然眼前一片漆黑,於是直 接把眼鏡都摔掉了,再也找不到。後來sfj 同學從學校管理處了解到昨晚路燈突然熄滅是 因為電路不堪重負,導致空氣開關跳閘。sfj同學仔細了解每盞路燈的耗電量a i 與照明度z i 已知共有n 盞電燈,並且 每盞電...

FME 2018 0發布及22大新功能

下面介紹該版本的22大功能。連線和轉換 更多的資料格式和變換能力 1 新的格式 讀模組 寫模組 bentley i model reader v1 cals continuous acquisition and life cycle support raster reader writer esri...