計蒜客——購買禮品
阿新 • • 發佈:2018-12-12
計蒜之道比賽馬上開始了,小蒜需要購買一些小禮品用來抽獎。
小蒜一共帶了 n 位同事前往,第 i 位同事身上攜帶了 元錢。真巧,禮品店的禮物的單價也正好都是 n。但是禮品店的老闆需要告訴小蒜,他這裡沒有零錢,所以小蒜需要湊到正好買整數個禮物的錢。現在小蒜髮動同事開始湊錢,每位同事要麼不參與湊錢,要麼就把所有的錢交給小蒜。
輸入格式
輸入第一行一個整數 n(),表示一同前往的同事數量。 接下來一行輸入每個人攜帶的錢的數量 ()
輸出格式
如果蒜頭君不能湊出合適的錢,輸出一行"Sadly"。
否者第一行輸出參與湊錢的人數 k,接下來一行以任意順序輸出 k 個人的編號(編號從 1 開始)用空格隔開。如果有多個方案,輸出任意一個即可。
本題答案不唯一,符合要求的答案均正確
樣例輸入
5 1 9 4 2 6
樣例輸出
3 2 3 4
#include<iostream> #include<cstring> using namespace std; int n; int p[100001]; //第i位同事身上的錢 int pre[100001]; //前i位同事身上共有多少錢 int vis[100001]; void Print(int a, int b) { cout << b - a + 1 << endl; for (int i = a; i <= b; i++) { cout << i; if (i != b)cout << " "; else cout << endl; } } int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> p[i]; } memset(pre, 0, sizeof(pre)); for (int i = 1; i <= n; i++) { pre[i] = pre[i - 1] + p[i]; } memset(vis, 0, sizeof(vis)); for (int i = 1; i <= n; i++) { if (pre[i]%n == 0) { Print(1, i); break; } if (vis[pre[i]%n] == 0) { vis[pre[i]%n] = i; } else { Print(vis[pre[i]%n] + 1, i); break; } } return 0; }