經典藍眼睛謎題數學結論:有 k 個藍眼睛島民,他們會在第 k 天集體離開。黑眼睛島民永遠不離開(輸出 -1)。
兩份代碼核心邏輯完全正確:
// 統計藍眼睛數量 k
int k = 0;
for (int i = 0; i < n; i++) if (eyes[i] == 0) k++;
// 輸出
for (int i = 0; i < n; i++) {
if (eyes[i] == 1) printf("-1 "); // 黑眼睛
else printf("%d ", k); // 藍眼睛輸出 k
}
原貼 C++ 代碼排版混亂、缺失部分,但最可能的邏輯錯誤是輸入循環終止條件:
int n;
cin >> n; // 只讀一組數據!
// 題目要求「多組數據」,需循環讀取直到 EOF
// C 風格(原 C 代碼正確)
while (scanf("%d", &n) != EOF) { ... }
// C++ 風格
while (cin >> n) { // 直到 EOF 或讀取失敗
vector eyes(n);
for (int i = 0; i < n; i++) cin >> eyes[i];
// 處理邏輯...
}
| 問題 | 檢查 |
|---|---|
| 輸出格式 | 每組數據單獨一行,數字間單空格,行末無多餘空格 |
| 大數據性能 | n≤10000,O(n)極快,無性能問題 |
| 換行符 | C++ 用 cout << '\n'; 而非 endl(刷新緩衝區慢) |
| 編譯標準 | 確保 -std=c++11 或更高 |
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
while (cin >> n) { // 關鍵:多組數據循環
vector eyes(n);
int blueCount = 0;
for (int i = 0; i < n; i++) {
cin >> eyes[i];
if (eyes[i] == 0) blueCount++;
}
for (int i = 0; i < n; i++) {
if (i) cout << ' ';
if (eyes[i] == 1) cout << -1;
else cout << blueCount;
}
cout << '\n';
}
return 0;
}
藍眼睛島民題核心邏輯:統計藍眼睛數 k,藍眼睛輸出 k,黑眼睛輸出 -1。C 代碼正確,C++ 版本 WA 多半因缺少多組數據循環讀取(while(cin>>n))或輸出格式問題。補全輸入循環即可 AC。