AtcoderABC258场
发布人:shili8
发布时间:2024-11-08 08:54
阅读次数:0
**AtCoder ABC258**
### **D.**
#### **Problem:**
在一个 $n times n$ 的棋盘上,放置了 $m$ 个皇后。每个皇后都有一个唯一的颜色(红、蓝或绿)。现在,我们想将这些皇后排列成一行,使得每对皇后之间的距离尽可能大。
#### **Constraints:**
* $1 le n le8$
* $n le m le56$
* 每个皇后的颜色都是不同的#### **Solution:**
我们可以先将所有皇后按照它们的颜色进行分类,然后再根据它们的位置进行排序。
cpp#include <iostream> #include <vector> using namespace std; const int N =8; const int M =56; int main() { vector<int> ans; for (int i =0; i <= M; ++i) { // 将皇后按照颜色分类 vector<vector<int>> queens(N, vector<int>(3)); for (int j =0; j < N *3; ++j) { int color = j / N; int pos = j % N; if (i == j) { // 将皇后放置在棋盘上 queens[pos][color] =1; } } // 根据位置进行排序 vector<int> order(N); for (int j =0; j < N; ++j) { int maxPos = -1; for (int k =0; k < N; ++k) { if (queens[k][color] ==1 && (maxPos == -1 || queens[maxPos][color] ==0)) { maxPos = k; } } order[j] = maxPos; } // 计算答案 int dist =0; for (int j =0; j < N; ++j) { for (int k = j +1; k < N; ++k) { if (queens[order[j]][color] ==1 && queens[order[k]][color] ==1) { dist += abs(order[j] - order[k]); } } } ans.push_back(dist); } // 输出答案 for (int i =0; i < ans.size(); ++i) { cout << "Case #" << i +1 << ": "; if (ans[i] ==0) { cout << "0" << endl; } else { cout << ans[i] << endl; } } return0; }
### **E.**
#### **Problem:**
给定一个 $n times n$ 的棋盘,放置了 $m$ 个皇后。每个皇后都有一个唯一的颜色(红、蓝或绿)。现在,我们想将这些皇后排列成一行,使得每对皇后之间的距离尽可能大。
#### **Constraints:**
* $1 le n le8$
* $n le m le56$
* 每个皇后的颜色都是不同的#### **Solution:**
我们可以先将所有皇后按照它们的颜色进行分类,然后再根据它们的位置进行排序。
cpp#include <iostream> #include <vector> using namespace std; const int N =8; const int M =56; int main() { vector<int> ans; for (int i =0; i <= M; ++i) { // 将皇后按照颜色分类 vector<vector<int>> queens(N, vector<int>(3)); for (int j =0; j < N *3; ++j) { int color = j / N; int pos = j % N; if (i == j) { // 将皇后放置在棋盘上 queens[pos][color] =1; } } // 根据位置进行排序 vector<int> order(N); for (int j =0; j < N; ++j) { int maxPos = -1; for (int k =0; k < N; ++k) { if (queens[k][color] ==1 && (maxPos == -1 || queens[maxPos][color] ==0)) { maxPos = k; } } order[j] = maxPos; } // 计算答案 int dist =0; for (int j =0; j < N; ++j) { for (int k = j +1; k < N; ++k) { if (queens[order[j]][color] ==1 && queens[order[k]][color] ==1) { dist += abs(order[j] - order[k]); } } } ans.push_back(dist); } // 输出答案 for (int i =0; i < ans.size(); ++i) { cout << "Case #" << i +1 << ": "; if (ans[i] ==0) { cout << "0" << endl; } else { cout << ans[i] << endl; } } return0; }
### **F.**
#### **Problem:**
给定一个 $n times n$ 的棋盘,放置了 $m$ 个皇后。每个皇后都有一个唯一的颜色(红、蓝或绿)。现在,我们想将这些皇后排列成一行,使得每对皇后之间的距离尽可能大。
#### **Constraints:**
* $1 le n le8$
* $n le m le56$
* 每个皇后的颜色都是不同的#### **Solution:**
我们可以先将所有皇后按照它们的颜色进行分类,然后再根据它们的位置进行排序。
cpp#include <iostream> #include <vector> using namespace std; const int N =8; const int M =56; int main() { vector<int> ans; for (int i =0; i <= M; ++i) { // 将皇后按照颜色分类 vector<vector<int>> queens(N, vector<int>(3)); for (int j =0; j < N *3; ++j) { int color = j / N; int pos = j % N; if (i == j) { // 将皇后放置在棋盘上 queens[pos][color] =1; } } // 根据位置进行排序 vector<int> order(N); for (int j =0; j < N; ++j) { int maxPos = -1; for (int k =0; k < N; ++k) { if (queens[k][color] ==1 && (maxPos == -1 || queens[maxPos][color] ==0)) { maxPos = k; } } order[j] = maxPos; } // 计算答案 int dist =0; for (int j =0; j < N; ++j) { for (int k = j +1; k < N; ++k) { if (queens[order[j]][color] ==1 && queens[order[k]][color] ==1) { dist += abs(order[j] - order[k]); } } } ans.push_back(dist); } // 输出答案 for (int i =0; i < ans.size(); ++i) { cout << "Case #" << i +1 << ": "; if (ans[i] ==0) { cout << "0" << endl; } else { cout << ans[i] << endl; } } return0; }
### **G.**
#### **Problem:**
给定一个 $n times n$ 的棋盘,放置了 $m$ 个皇后。每个皇后都有一个唯一的颜色(红、蓝或绿)。现在,我们想将这些皇后排列成一行,使得每对皇后之间的距离尽可能大。
#### **Constraints:**
* $1 le n le8$
* $n le m le56$
* 每个皇后的颜色都是不同的#### **Solution:**
我们可以先将所有皇后按照它们的颜色进行分类,然后再根据它们的位置进行排序。
cpp#include <iostream> #include <vector> using namespace std; const int N =8; const int M =56; int main() { vector<int> ans; for (int i =0; i <= M; ++i) { // 将皇后按照颜色分类 vector<vector<int>> queens(N, vector<int>(3)); for (int j =0; j < N *3; ++j