मान लीजिए कि एक टेबल पर एन कार्ड हैं, प्रत्येक कार्ड के दोनों तरफ एक सकारात्मक पूर्णांक मुद्रित (संभवतः अलग)। हमें कितने भी कार्ड फ्लिप करने होते हैं, और उसके बाद हम एक कार्ड चुनते हैं। यदि चुने हुए कार्ड के पीछे की ओर X का अंक किसी कार्ड के सामने नहीं है, तो संख्या X को शुभ माना जाता है। हमें वह छोटी से छोटी संख्या ज्ञात करनी है जो अच्छी हो? जब कोई संख्या अच्छी न हो, तो 0 लौटाएँ। यहाँ, फ़्रंट [i] और पीछे [i] कार्ड i के आगे और पीछे की संख्या का प्रतिनिधित्व करते हैं। एक फ्लिप आगे और पीछे के नंबरों की अदला-बदली करेगा, इसलिए आगे का मान अब पीछे और इसके विपरीत है।
तो अगर इनपुट मोर्चों की तरह है =[1,2,4,4,7] और बैक =[1,3,4,1,3], तो आउटपुट 2 होगा। तो अगर हम दूसरा कार्ड फ्लिप करते हैं, सामने का मूल्य [1,3,4,4,7] होगा, और पीछे का मूल्य [1,2,4,1,3] होगा। हम दूसरा कार्ड चुनेंगे, जिसके पीछे नंबर 2 होगा, और यह किसी कार्ड के सामने नहीं है, इसलिए 2 एक अच्छी संख्या है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक सेट परिभाषित करें s, n :=मोर्चों का आकार, ret :=inf
- मैं के लिए 0 से n - 1 की सीमा में
- अगर फ़्रंट[i] =पीछे[i], तो फ़्रंट[i] को s में डालें
- मैं के लिए 0 से n - 1 की सीमा में
- अगर फ़्रंट्स[i] सेट में हैं तो रिट :=न्यूनतम रिट और फ़्रंट्स[i]
- मैं के लिए 0 से n - 1 की सीमा में
- यदि बैक [i] सेट में नहीं है तो रिट :=न्यूनतम रिट और बैक [i]
- रिटर्न 0 जब रिट =इंफ, अन्यथा रेट करें।
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: int flipgame(vector<int>& fronts, vector<int>& backs) { set <int> s; int n = fronts.size(); int ret = INT_MAX; for(int i = 0; i < n; i++){ if(fronts[i] == backs[i])s.insert(fronts[i]); } for(int i = 0; i <n; i++ ){ if(s.count(fronts[i]) == 0) ret = min(ret, fronts[i]); } for(int i = 0; i <n; i++ ){ if(s.count(backs[i]) == 0) ret = min(ret, backs[i]); } return ret == INT_MAX? 0 : ret; } }; main(){ vector<int> v1 = {1,2,4,4,7}; vector<int> v2 = {1,3,4,1,3}; Solution ob; cout << (ob.flipgame(v1, v2)); }
इनपुट
[1,2,4,4,7] [1,3,4,1,3]
आउटपुट
2