QOJ.ac

QOJ

Time Limit: 2.0 s Memory Limit: 1024 MB Total points: 100

#25312. קאנג (Kang)

Statistics

משחק קלפים אחד, הנחשב למבחן של תבונה, נקרא "קאנג". במשחק זה, לכל קלף יש ניקוד שהוא מספר שלם חיובי. בתחילת המשחק תקבלו $N$ קלפים להחזיק בידכם, וישנם עוד $M$ קלפים המונחים גלויים על השולחן בשורה משמאל לימין, כאשר אתם רואים את הניקוד של כל הקלפים — הן אלו שקיבלתם ליד והן אלו המונחים על השולחן. לאחר מכן, תוכלו למשוך קלפים נוספים מהשולחן במשך $k$ סיבובים, כאשר עליכם למשוך קלף אחד בכל פעם לפי הסדר משמאל לימין. לאחר משיכת קלף בכל סיבוב, באפשרותכם להשליך קלפים מהיד פעם אחת (1) — כל מספר של קלפים ביד שיש להם אותו ניקוד. עליכם לתכנן את המשחק כך שלאחר משיכת קלפים מהשולחן והשלכת קלפים מהיד במשך $k$ סיבובים מלאים, סכום הניקוד של הקלפים שנותרו ביד יהיה הקטן ביותר האפשרי.

נתבונן בדוגמה הבאה:

אם בהתחלה יש לכם חמישה קלפים עם ניקוד $6, 3, 9, 6, 3$, והקלפים המונחים על השולחן משמאל לימין הם בעלי ניקוד $4, 6, 9, 6$:

מקרה $k = 1$: אם באפשרותכם למשוך רק קלף אחד (1) מהשולחן, כאשר תמשכו את הקלף הראשון, ניקוד הקלפים שברשותכם יהיה $6, 3, 9, 6, 3, 4$. לאחר מכן תוכלו לבחור להשליך קלפים בעלי אותו ניקוד פעם אחת (1). הדרך הטובה ביותר היא לבחור להשליך 2 קלפים שהניקוד שלהם שווה ל-$6$, כדי שסכום הניקוד של הקלפים הנותרים יהיה הקטן ביותר ויעמוד על $3 + 9 + 3 + 4 = 19$.

מקרה $k = 2$: אם באפשרותכם למשוך 2 קלפים מהשולחן, הדרך הטובה ביותר היא: לאחר משיכת הקלף הראשון שהניקוד שלו שווה ל-$4$, תבחרו להשליך קלף אחד שהניקוד שלו שווה ל-$9$. הקלפים שנותרו ביד הם בעלי ניקוד $6, 3, 6, 3, 4$. לאחר מכן, כאשר תמשכו את הקלף ה-2 שהניקוד שלו שווה ל-$6$, תוכלו להשליך 3 קלפים שהניקוד שלהם שווה ל-$6$, מה שיגרום לכך שלקלפים הנותרים יהיה סכום הניקוד הקטן ביותר השווה ל-$3 + 3 + 4 = 10$.

מקרה $k = 3$: אם באפשרותכם למשוך 3 קלפים מהשולחן, הדרך הטובה ביותר היא: כאשר תמשכו את הקלף הראשון, ניקוד הקלפים ביד יהיה $6, 3, 9, 6, 3, 4$. לאחר מכן ניתן לבחור להשליך קלפים בעלי אותו ניקוד פעם אחת (1), והדרך הטובה ביותר היא להשליך את שני (2) הקלפים שהניקוד שלהם שווה ל-$3$, כך שיישארו ביד הקלפים $6, 9, 6, 4$. לאחר מכן, כאשר תמשכו את הקלף ה-2 שהניקוד שלו שווה ל-$6$, תוכלו להשליך 3 קלפים שהניקוד שלהם שווה ל-$6$, ויישארו ביד הקלפים $9, 4$. וכאשר תמשכו בפעם ה-3 קלף שהניקוד שלו שווה ל-$9$, תוכלו להשליך את שני (2) הקלפים שהניקוד שלהם שווה ל-$9$, מה שיגרום לכך שסכום הניקוד של הקלפים הנותרים יהיה $4$.

מקרה $k = 4$: אם באפשרותכם למשוך 4 קלפים מהשולחן, הדרך הטובה ביותר היא: לאחר משיכת הקלף הראשון שהניקוד שלו שווה ל-$4$, בחרו להשליך קלף אחד שהניקוד שלו שווה ל-$4$, כך שיישארו ביד קלפים עם ניקוד $6, 3, 9, 6, 3$. לאחר מכן, במשיכה ה-2 הקלף הוא בעל ניקוד השווה ל-$6$; הדרך הטובה ביותר היא להשליך את שני (2) הקלפים שהניקוד שלהם שווה ל-$3$, כך שיישארו ביד הקלפים $6, 9, 6, 6$. במשיכה ה-3 הקלף הוא בעל ניקוד השווה ל-$9$; בחרו להשליך את שני (2) הקלפים שהניקוד שלהם שווה ל-$9$. ובמשיכת הקלף האחרון שהניקוד שלו שווה ל-$6$, תוכלו להשליך 4 קלפים שהניקוד שלהם שווה ל-$6$. השלכה זו גורמת לכך שלא נותרים קלפים ביד, כלומר סכום הניקוד של הקלפים הוא $0$.

המשימה שלכם (Your Task)

מצאו את "סכום הניקוד הקטן ביותר של הקלפים שנותרו ביד" לאחר סיום $k$ סיבובים עבור $k = 1, 2, 3, \ldots, M$.

לשאלה זו יש פורמט כתיבת תוכנית השונה מהפורמט הרגיל, אשר ישמש בתחרות בפועל. אנא עיינו בסוף שאלה זו לגבי אופן השימוש.

פרטי מימוש

עליכם לממש את הפונקציה הבאה:

std::vector<long long> capsize(std::vector<int> A, std::vector<int> B)

עם הפרמטרים הבאים:

  • $A$ הוא מערך באורך $N$ המציין את מספרי הקלפים ביד בהתחלה.
  • $B$ הוא מערך באורך $M$ המציין את מספרי הקלפים המונחים על השולחן, מסודרים משמאל לימין.
  • הפונקציה תחזיר מערך $C$ באורך $M$ המייצג את סכום הניקוד הקטן ביותר האפשרי של הקלפים ביד לאחר $k$ סיבובים עבור $k = 1, 2, 3, \ldots, M$.

לדוגמה, אם $A = [6, 3, 9, 6, 3]$ ו-$B = [4, 6, 9, 6]$, על הפונקציה להחזיר את המערך $[19, 10, 4, 0]$.

מגבלות

  • $1 \le N, M \le 10^6$
  • $1 \le A[i] \le 10^9$ לכל $i$ המקיים $1 \le i \le N$
  • $1 \le B[i] \le 10^9$ לכל $i$ המקיים $1 \le i \le M$

תתי-משימות

קבוצת מבחנים ניקוד מרבי לקבוצת מבחנים זו תנאים
1 5% $N, M \le 5$
2 7% $N \le 1\,000$ ו-$M = 1$
3 8% $N, M \le 1\,000$, לכל הקלפים (הן הקלפים שביד והן הקלפים המוצגים על השולחן) יש מספרים שונים זה מזה
4 12% $N, M \le 1\,000$, לכל הקלפים שמתקבלים בנוסף יש אותו ערך
5 16% $N, M \le 1\,000$
6 28% $N, M \le 100\,000$
7 24% ללא תנאים נוספים

הערות

הנחיות לכתיבת התוכנית

עבור שאלה זו, אופן כתיבת התוכנית והגשתה למערכת הבדיקה (Grader) שונה מהפורמט הכללי של כתיבת תוכניות, שבו המתחרה נדרש לכתוב את חלק קליטת הקלט ואת חלק הדפסת הפלט. בשאלה זו, על המתחרה לכתוב רק את חלק החישוב הנדרש בתוך הפונקציה הנתונה. נתוני הקלט השונים יהיו זמינים דרך פרמטרי הפונקציה, ותוצאות החישוב יוחזרו אף הן דרך הפונקציה, כך שהמתחרה אינו צריך לכתוב את חלק קליטת הקלט ואינו צריך לכתוב את חלק הדפסת הפלט.

המתחרה יקבל מספר קבצים כמפורט להלן; על המתחרה לערוך קובץ אחד בלבד כפי שמוגדר בשאלה ולהגיש קובץ זה למערכת:

  • grader.cpp הוא הקובץ הראשי האחראי על קליטת הקלט והוצאת הפלט.
  • kang.cpp הוא הקובץ שבו על המתחרה לכתוב את חישובי התוכנית השונים והוא הקובץ שהמתחרה מגיש למערכת (בקובץ kang.cpp אסור שתהיה פונקציית main(), אך מותר שיהיו פונקציות אחרות).
  • run_cpp.sh הוא קובץ שהמתחרה יכול להפעיל כדי להריץ את התוכנית כולה.
  • compile_cpp.sh הוא קובץ שהמתחרה יכול להפעיל כדי להדר (לקמפל) את התוכנית.

המתחרה יקבל קובץ .zip הניתן להורדה מהמערכת, וכאשר מחלצים (extract) אותו נמצאים בו כל 4 הקבצים. מומלץ למתחרה להשתמש בעורך טקסט (text editor) או ב-IDE כדי לערוך את הקובץ kang.cpp, ולהדר או להריץ את התוכנית באמצעות הפעלת compile_cpp.sh או run_cpp.sh.

כאשר המתחרה מפעיל את הקובץ run_cpp.sh כדי להריץ את התוכנית, התוכנית תפעל כפי שמפורט בקובץ grader.cpp, והסעיף "תיאור קובץ הבודק" מסביר את אופן פעולתו של קובץ זה.

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.