C#Main.cs · 66 行using System;using System.Text; struct Machine{ public int[] Stock; // 배열은 참조다: 구조체를 대입해도 배열 자체는 복사되지 않는다 public int Sales; // 배열까지 새로 만든 복사본 public Machine Copy() { Machine c = this; c.Stock = (int[])Stock.Clone(); return c; } // 메서드는 자기 자신(this)을 제자리에서 바꾼다 public bool Take(int x, int money, int[] price) { if (Stock[x] == 0 || money < price[x]) return false; Stock[x]--; Sales += price[x]; return true; }} class Program{ static void Main() { var data = Console.In.ReadToEnd().Split((char[]?)null, StringSplitOptions.RemoveEmptyEntries); int pos = 0; int k = int.Parse(data[pos++]), q = int.Parse(data[pos++]); var m = new Machine { Stock = new int[k], Sales = 0 }; var price = new int[k]; for (int i = 0; i < k; i++) m.Stock[i] = int.Parse(data[pos++]); for (int i = 0; i < k; i++) price[i] = int.Parse(data[pos++]); var sb = new StringBuilder(); for (int o = 0; o < q; o++) { int money = int.Parse(data[pos++]), t = int.Parse(data[pos++]); Machine trial = m.Copy(); int failed = 0; for (int j = 0; j < t; j++) { int x = int.Parse(data[pos + j]) - 1; if (!trial.Take(x, money, price)) { failed = j + 1; break; } money -= price[x]; } pos += t; if (failed > 0) { sb.Append("fail ").Append(failed).Append('\n'); } else { m = trial; sb.Append("ok ").Append(money).Append('\n'); } } sb.Append(string.Join(" ", m.Stock)).Append('\n').Append(m.Sales).Append('\n'); Console.Write(sb); }}
C++main.cpp · 53 行#include <iostream>#include <vector>using namespace std; struct Machine { vector<int> stock; // vector 멤버는 구조체를 대입할 때 원소까지 복사된다 int sales = 0;}; vector<int> price; // 제자리에서 바꾸려고 참조로 받는다bool take(Machine& t, int x, int money) { if (t.stock[x] == 0 || money < price[x]) return false; t.stock[x]--; t.sales += price[x]; return true;} int main() { int k, q; cin >> k >> q; Machine m; m.stock.resize(k); price.resize(k); for (int& s : m.stock) cin >> s; for (int& p : price) cin >> p; for (int o = 0; o < q; o++) { int money, t; cin >> money >> t; vector<int> picks(t); for (int& x : picks) cin >> x; Machine trial = m; // 재고와 매출이 모두 복사된다 int failed = 0; for (int j = 0; j < t; j++) { int x = picks[j] - 1; if (!take(trial, x, money)) { failed = j + 1; break; } money -= price[x]; } if (failed) { cout << "fail " << failed << '\n'; } else { m = trial; cout << "ok " << money << '\n'; } } for (int i = 0; i < k; i++) cout << (i ? " " : "") << m.stock[i]; cout << '\n' << m.sales << '\n'; return 0;}
Cmain.c · 51 行#include <stdio.h> #define MAXK 8#define MAXT 20 typedef struct { int stock[MAXK]; // 구조체 안의 배열은 구조체를 대입할 때 통째로 복사된다 int sales;} Machine; int price[MAXK]; // 제자리에서 바꾸려고 포인터로 받는다int take(Machine *t, int x, int money) { if (t->stock[x] == 0 || money < price[x]) return 0; t->stock[x]--; t->sales += price[x]; return 1;} int main(void) { int k, q; if (scanf("%d %d", &k, &q) != 2) return 0; Machine m = {{0}, 0}; for (int i = 0; i < k; i++) scanf("%d", &m.stock[i]); for (int i = 0; i < k; i++) scanf("%d", &price[i]); for (int o = 0; o < q; o++) { int money, t, picks[MAXT]; scanf("%d %d", &money, &t); for (int j = 0; j < t; j++) scanf("%d", &picks[j]); Machine trial = m; // 재고 배열과 매출이 모두 복사된다 int failed = 0; for (int j = 0; j < t; j++) { int x = picks[j] - 1; if (!take(&trial, x, money)) { failed = j + 1; break; } money -= price[x]; } if (failed) { printf("fail %d\n", failed); } else { m = trial; printf("ok %d\n", money); } } for (int i = 0; i < k; i++) printf(i ? " %d" : "%d", m.stock[i]); printf("\n%d\n", m.sales); return 0;}