# Array# Sorting# Greedy

d244 - 一堆石頭

🔗 前往 ZeroJudge 原題

題目描述

題目給定一串以空格分隔的正整數,這些數字代表潘潘目前擁有的石頭編號。已知潘潘原本每顆石頭都複製了兩個,然後掉了一顆,因此目前擁有的石頭數量是 3 的倍數減 1。題目要求找出掉落的那顆石頭的編號。

解題思路

解題思路是先將輸入的數字陣列進行排序。由於掉落的石頭原本應該有三個相同的編號,排序後,如果某個編號出現次數少於三次,那麼這個編號就是掉落的石頭。程式碼中,迴圈以三個數字為一組進行檢查,如果發現某組數字不全相同,則輸出該組的第一個數字,即為掉落的石頭編號。

複雜度分析

  • 時間複雜度: O(n log n),主要來自於排序操作。
  • 空間複雜度: O(n),主要來自於儲存輸入數字的陣列。

程式碼

#include <iostream>
#include <string>
#include <sstream> 
#include <algorithm>
using namespace std;
int main(){
	string a;
	while(getline(cin,a)){
		int n=1;
		for(int i=0;i<a.length();i++){
			if(a[i]==' ')
				n++;
		}
		stringstream ss(a);
		int b[n];
		for(int i=0;i<n;i++)
			ss>>b[i];
		sort(b,b+n);
		for(int i=0;i<n-1;i+=3){
			if(b[i]!=b[i+1]||b[i+1]!=b[i+2]){
				cout << b[i] << endl;
				break;
			}
		}
	}
}

Discussion