1438 方陣與完全平方數
基準時間限制:1 秒 空間限制:131072 kb 分值: 40
難度:4級演算法題
如果乙個由正整數組成的n*n的方陣,滿足以下條件:
1,每個數字各不相同
2,每行以及每列的和,都是互不相同的完全平方數
我們稱這種方陣為超級完全平方數方陣。
輸入n,輸出乙個n*n的超級完全平方數方陣。如果存在多個方陣滿足條件,輸出將所有元素按行、列順序排列後字典序最小的乙個答案。例如
n=3時,下面兩個方陣都符合條件
1 2 6
3 4 9
21 30 49
21 30 49
3 4 9
1 2 6
按行、列順序排列後,第乙個方陣表示為[1, 2, 6, 3, 4, 9, 21, 30, 49],第二個方陣表示為[21, 30, 49, 3, 4, 9, 1, 2, 6]。第乙個方陣字典序更小一些。
如果不存在這樣的方陣,輸出no solution。
input
僅一行,為乙個正整數n。(1 <= n <= 64)output
輸出n行,每行為n個整數,之間用空格隔開,表示所求的n*n方陣。或者,輸出no solution。input示例
3output示例
1 2 63 4 9
21 30 49
mostleg
(題目提供者)
題解:首先,n=1時無解。
接下來處理n>=2的情況。由於
題目要求字典序最小的方陣,使用貪心演算法的思想,不難發現,每一行每一列其實只需要依靠最後乙個數字(最右邊和最下邊的數字)就足夠使得該行該列的和達到乙個沒有使用過的完全平方數。因此,按照題目中對方陣序列化的次序,對無關緊要的位置都盡力使用最小的數字;每當到達一行的最後乙個位置,或者最後一行的時候,再去尋找符合題目要求的最後乙個數字。這樣做直到右下角的最後乙個位置。
此時,最後一行和最後一列都需要滿足和為完全平方數的條件。搜尋最小的符合條件的數字。如果找不到解,就加大倒數第二個位置的數字(因為這樣做對字典序的影響最小),再重新搜尋最後乙個位置。
怎樣快速發現最後乙個位置找不到解呢?不難發現,最後一列的和必定小於最後一行的和,設它們的差為d。我們可以列舉較小的乙個完全平方數x,如果發現x的下乙個完全平方數與x的差已經大於d,則在最後乙個位置無解。
#include#include#include#includeusing namespace std;
typedef long long ll;
#define maxn 65
ll a[maxn][maxn],n,flag,used[100005],used1[100005];
ll find(ll x)
void dfs(ll x,ll y,ll id)
for(i=2;;i++)//列舉第n行的和
flag=1;
return;
}long long t=yy-xx;
if((i+1)*(i+1)-i*i>t)
}} else if(x==n)
else if(y==n)
else }
}int main()
a[1][1]=1;
dfs(1,1,1);
}
51NOD 與7無關數
1082 與7無關的數 有道難題 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 乙個正整數,如果它能被7整除,或者它的十進位制表示法中某個位數上的數字為7,則稱其為與7相關的數。求所有小於等於n的與7無關的正整數的平方和。例如 n 8,8與7無關的數包括 1 2 ...
51nod 第K大的數
題目鏈結 題意 題目給了我們陣列a和b,然後給了c陣列中各個元素是由陣列a和b相應元素相乘得到。讓我們求出陣列c中的第k大元素的值。題解 這道題目陣列a和b的長度n是5e4,因此直接不能直接求出所有陣列c元素的值。這類求第k大的問題,有時可以使用二分的方法進行求解。這道題目二分的思路就是,將陣列a和...
51nod動態規劃 矩陣取數
乙個n n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,從左上走到右下,只能向下向右走,求能夠獲得的最大價值。例如 3 3的方格。1 3 3 2 1 3 2 2 1 能夠獲得的最大價值為 11。input 第1行 n,n為矩陣的大小。2 n 500 第2 n 1行 每行n個數,中間用空...