題目描述:
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的人的選擇處...