2014程式設計之美資格賽第三題 格格取數

2021-06-21 12:45:55 字數 1434 閱讀 1605

題目:

時間限制:

2000ms

單點時限:

1000ms

記憶體限制:

256mb

給你乙個m x n (1 <= m, n <= 100)的矩陣a (0<=aij

<=10000),要求在矩陣中選擇一些數,要求每一行,每一列都至少選到了乙個數,使得選出的數的和盡量的小。

多組測試資料。首先是資料組數t

對於每組測試資料,第1行是兩個正整數m, n,分別表示矩陣的行數和列數。

接下來的m行,每行n個整數,之間用乙個空格分隔,表示矩陣a的元素。

每組資料輸出一行,表示選出的數的和的最小值。

小資料:1 <= m, n <= 5

大資料:1 <= m, n <= 100

樣例輸入

2

3 31 2 3

3 1 2

2 3 1

5 51 2 3 4 5

5 1 2 3 4

4 5 1 2 3

3 4 5 1 2

2 3 4 5 1

解題思路:

假設矩陣起始是行和列相等的,即起初m=n.

f(m,n)= min m=n時 0<=i<=n

min m因為是從m=n的矩陣開始,先m-1,再n-1,所以不存在 m>n的情況。

然而題目中m和n有可能不相等,不妨假設 m>n

將m>n的矩陣部分,每一行都取該行最小值。

#include#include#includeusing namespace std;

//fun函式用來解決 矩陣中行與列相等的那部分。

int fun(int **p,int m,int n,vectorm_i,vectorn_j)

int min=65535;

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

int min=65535;

for(int i=0;i<=m;i++)

{ vector::iterator result=find(m_i.begin(),m_i.end(),i);

if(result!=m_i.end()) continue;

m_i.push_back(i);

int temp=p[i][n]+fun(p,m,n-1,m_i,n_j);

m_i.pop_back();

if(temp>m>>n;//m為行 n為列

int **p=new int*[m];

for(int i=0;i>p[i][j];

//m比n大,則把m>n的行,每一行取最小值

int part_sum=0;

if(m>n)

{ for(int i=n;i(),vector())+part_sum<(),vector())+part_sum<(),vector())《型別的m_i 和n_j  中。 

程式設計之美資格賽

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定2個樹a和b,保證a的節點個數 b的節點個數。現在你需要對樹a的邊進行二染色。乙個好的染色方案,指不存在乙個樹a中的連通塊,同時滿足以下2個條件 1.其中只有同色的邊 2.和b同構。兩個樹同構是指,存在乙個一一對映 既是單射...

程式設計之美2015資格賽

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定兩個日期,計算這兩個日期之間有多少個2月29日 包括起始日期 1.年份能被4整除但不能被100整除 2.年份能被400整除 第一行為乙個整數t,表示資料組數。之後每組資料報含兩行。每一行格式為 month day,year ...

2013程式設計之美資格賽總結

終於可以完成乙個程式比賽的題目了,雖然這次的時間有些長。這是第一次完成,感到真心不錯。廢話不說了,下面說一下這次程式設計之美預選賽的情況。當我在凌晨看到這三個題目時,感覺第乙個還有希望,第二個一點思路沒有,第三個不敢期望。第乙個是詞對變換,感覺不太難。第二道是一種.怎麼說呢,反正是一點思路沒有。第三...