# Greedy# Simulation# Conditional Statements

i860 - 13171 - Pixel Art

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷給定的像素圖像是否可以使用有限數量的洋紅色(magenta)、黃色(yellow)和青色(cyan)顏色來繪製。圖像由一系列像素組成,每個像素可以是 magenta (M), yellow (Y), cyan (C), red (R), black (B), green (G), violet (V) 或 white (W)。題目給定了每種原色的數量,並要求根據顏色混合方案判斷是否能夠繪製出整個圖像。如果可以繪製,則輸出 "YES" 以及剩餘的洋紅色、黃色和青色數量;否則,輸出 "NO"。

解題思路

這題的解題思路是模擬像素的繪製過程。對於每個像素,根據其顏色,減少相應原色的數量。例如,如果像素是紅色(R),則減少洋紅色和黃色的數量。如果像素是黑色(B),則減少洋紅色、黃色和青色的數量。在處理完所有像素後,檢查每種原色的數量是否都大於或等於 0。如果所有原色的數量都大於或等於 0,則表示可以繪製出整個圖像,輸出 "YES" 以及剩餘的數量;否則,輸出 "NO"。

複雜度分析

  • 時間複雜度: O(n),其中 n 是字串 s 的長度。因為程式碼需要遍歷字串 s 中的每個字符。
  • 空間複雜度: O(1),因為程式碼只使用了固定數量的變數來存儲原色的數量和字串。

程式碼

#include <iostream>
using namespace std;
int t,a[3];
string s;
int main(){
	cin.tie(0); ios::sync_with_stdio(0);
	cin >> t;
	for(int ca=1;ca<=t;++ca){
		for(int i=0;i<3;++i)
			cin >> a[i];
		cin >> s;
		for(int i=0;i<s.size();++i){
			if(s[i]=='M')--a[0];
			else if(s[i]=='Y')--a[1];
			else if(s[i]=='C')--a[2];
			else if(s[i]=='R')--a[0],--a[1];
			else if(s[i]=='V')--a[0],--a[2];
			else if(s[i]=='G')--a[1],--a[2];
			else if(s[i]=='B')--a[0],--a[1],--a[2];
		}
		bool ac=1;
		for(int i=0;i<3;++i)
			if(a[i]<0)ac=0;
		cout << (ac?"YES":"NO");
		for(int i=0;i<3;++i)
			if(ac)cout << " " << a[i];
		cout << "\n";
	} 
}

Discussion