選數字(貪心)

2022-03-14 10:07:51 字數 1771 閱讀 1762

題目描述:

lyk 找到了乙個 n*m 的矩陣,這個矩陣上都填有一些數字,對於第 i 行第 j 列的位置上的數為 ai,j。

由於它 ak 了 noip2016 的初賽,最近顯得非常無聊,便想到了乙個方法自娛自樂一番。

它想到的遊戲是這樣的:每次選擇一行或者一列,它得到的快樂值將會是這一行或者一列的數字之和。之後它將該行或者該列上的數字都減去 p(之後可能變成負數)。如此,重複 k次,它得到的快樂值之和將會是它 noip2016 複賽比賽時的 rp 值。

lyk 當然想讓它的 rp 值盡可能高,於是它來求助於你。

輸入格式:

第一行 4 個數 n,m,k,p.

接下來 n 行 m 列,表示 ai,j。

輸出格式:

輸出一行表示最大 rp 值。

輸入樣例:

2 2 5 2

1 3

2 4

輸出樣例:

11資料範圍:

總共 10 組資料。

對於第 1,2 組資料 n,m,k<=5。

對於第 3 組資料 k=1。

對於第 4 組資料 p=0。

對於第 5,6 組資料 n=1, m,k<=1000。

對於第 7,8 組資料 n=1, m<=1000, k<=1000000。

對於所有資料 1<=n,m<=1000, k<=1000000, 1<=ai,j<=1000, 0<=p<=100。

樣例解釋:

第一次選擇第二列,第二次選擇第二行,第三次選擇第一行,第四次選擇第二行,第五次選擇第一行,快樂值為 7+4+2+0+-2=11。

思路:

觀察可以發現如果確定選幾次行幾次列

那麼選的順序是無所謂的

對於選行 那麼肯定是選最優的 對於行也是

所以 先處理出選0~k次行和列的最優值

然後列舉選i次行則選k-i次列

行的最優值加上列的最優值減去選行和列交叉的地方多選的即可

ans=max(ans,s[i]+r[i]-(i)*(k-i)*p)

#include

#include

#include

#define lon long long

using namespace std;

const int maxn=1010;

const lon inf=-1000000000000000;

lon n,m,k,p,h[maxn*maxn],l[maxn*maxn],a[maxn][maxn];

priority_queueq;

lon init()

while(c>='0'&&c<='9')

return

x*f;

}int main()

for(lon i=1;i<=k;i++)

while(!q.empty()) q.pop();

for(lon j=1;j<=m;j++)

for(lon i=1;i<=k;i++)

lon ans=inf;

for(lon i=0;i<=k;i++)

ans=max(ans,h[i]+l[k-i]-i*(k-i)*p);

cout0;}

選數字(貪心 列舉)

選數字 select time limit 3000ms memory limit 64mb 題目描述 lyk 找到了乙個 n m 的矩陣,這個矩陣上都填有一些數字,對於第 i 行第 j 列的位置上 的數為 ai,j。由於它 ak 了 noip2016 的初賽,最近顯得非常無聊,便想到了乙個方法自娛...

貪心題目選講

假定海岸線是一條無限延伸的直線,陸地在海岸線的一邊,大海在另一側。海中有許多島嶼,每乙個小島我們可以認為是乙個點。現在要在海岸線上安裝雷達,雷達的覆蓋範圍是d,也就是說大海中乙個小島能被安裝的雷達覆蓋,那麼它們之間的距離最大為d。我們使用平面直角座標系,定義海岸線是x軸,大海在x軸上方,陸地在下方。...

選數字(多人博弈)

100個人,每個人選擇乙個 1 100範圍內的乙個數字,誰的數字最接近平均數的 2 3,誰將獲得獎金。如果是你,你會選幾?前提是每個人都想贏得獎金。分析步驟 1.每個人都不會選67 100之間的數字,因為最大數字為100,如果全班人都選100,那麼平均值的2 3為 67,這樣選擇大於67的人的選擇處...