現在,你也拿到了另一個不知名的古文獻,其中含有 n 個單字,你的任務是要把文中的文字「字字相連」,再依電腦所提供的 m 個整數 A1, A2, …, Am,從這個長字串找出第 A1, A2, …, Am 個字母併成一個單字。
例如 所收到的文獻為:the quick brown fox jumps over the lazy dog 連接成一個長字串:thequickbrownfoxjumpsoverthelazydog 電腦提供的線索為:33, 11, 34, 19, 21, 33, 30, 32 所併成的單字:doomsday
輸入
輸入檔中有多組測試資料。
每組測試資料的第一行是兩個正整數 n(<1000001), m(<101)。接下來的 n 行每行有一個英文單字,每個單字的長度不超過 100。最後一行有 m 個以空白隔開的正整數,所提供的數字不會超過字串的總長度。
當 n, m 均為 0 表示檔案結束,不須處理這組輸入。
9 8 the quick brown fox jumps over the lazy dog 33 11 34 19 21 33 30 32 0 0
注意! Visual Studio 等較新的編譯器會將 gets() 讀入字串時會將'\n'字元保留,但 ZeroJudge 不會。
完整程式碼
AC (13ms, 4.9MB)
#include<stdio.h> #include<string.h>
charlist[60000010], ans[101], * input;
intmain() { int n, m, tmp; while (scanf(" %d %d", &n, &m) == 2 && n + m) { getchar(); input = list; int length = 0; for (int i = 0; i < n; i++) { gets(input); input += strlen(input); } for (int i = 0; i < m; i++) { scanf(" %d", &tmp); ans[i] = list[tmp - 1]; } ans[m] = 0; puts(ans); } return0; }
1. 每 K 個電話可以要其他 W 個學姊/妹的電話
2. 用過的電話不可再使用
3. 換到的電話視為新的電話(也就是可以再拿去換)
輸入
單筆輸入 輸入只有三個整數 N, K, W (N, K, W <= 10^4, 且 W < K) 代表一開始學長拿到的電話數及學姊給的限制 K 及 W
// Example 1 6 5 1
// Example 2 144 188 87
// Example 3 9 3 2
輸出
輸出只有一行一個整數。 代表學長總共可以拿到的電話總數。 答案範圍保證在 int 範圍。
// Example 1 7
// Example 2 144
// Example 3 23
解題思路
每將 k 個可用的電話號碼拿去交換,可用的電話號碼會減 k 個,能用的加 w 個,根據題意 k > w,所以可以看成每交換一次,能用的電話號碼會減少 (k-w) 個。
利用除法判斷剩下的電話號碼(n)有幾組 k 能交換,然後一次減掉 (k-w) * 組數,如此循環直到 n / k = 0 代表無法再交換了,跳出迴圈輸出答案。
完整程式碼
AC (2ms, 112KB)
#include<stdio.h>
intmain() { int n, k, w, m, sum, gap; scanf(" %d %d %d", &n, &k, &w); sum = n, gap = k - w; for (int i = n / k; i; i = n / k) sum += w * i, n -= gap * i; printf("%d\n", sum); return0; }
voidswapNode(int lhs, int rhs) { SWAP(heap[lhs].score, heap[rhs].score), SWAP(heap[lhs].dec, heap[rhs].dec); }
voidinsNode() { last++; scanf(" %d %d", &heap[last].score, &heap[last].dec); now = last, base = now >> 1; while (base && heap[now].score > heap[base].score) swapNode(now, base), now >>= 1, base >>= 1; }
voidheapify() { now = 1, derived = 2; while (derived <= last) { if (heap[derived].score < heap[derived + 1].score && derived < last) derived++; if (heap[derived].score < heap[now].score) break; swapNode(now, derived), now = derived, derived <<= 1; } }
intmain() { int n, t, ans; while (scanf(" %d %d", &n, &t) == 2) { ans = last = 0; while (n--) insNode(); while (t--) { ans += heap[1].score; heap[1].score -= heap[1].dec; heapify(); if (last && heap[last].score <= 0) last--; } printf("%d\n", ans); } return0; }
intmain() { int n, x, y, a, b; while (scanf(" %d", &n) == 1) { x = y = 0; for (int i = 0; i < n; i++) { scanf(" %d %d", &a, &b); switch (a) { case0: y += b; break; case1: x += b; break; case2: y -= b; break; default: x -= b; break; } } printf("%d %d\n", x, y); } return0; }
裴裴剛上大學,決定來認識一些女生。校園裡有 n 個女生,分別編號為 1~n,她們都有一個共同的特性,就是如果你花 si的時間陪伴她,她就會滿足,你就會從她身上得到 vi的好感度,但花超過 si的時間陪她也不會得到額外的好感度。
但是經過裴裴的精心研究發現,這些女生可以細分為兩種類型。第一種類型的女生有一個特性,就是她們回饋你的好感度正比於你陪他們的時間。也就是如果第 i 個女生是第一類的女生,你花 si/k 的時間陪她,就會得到 vi/k 的好感度。第二種類型的女生就比較麻煩了,除非你讓他滿足(也就是花 si的時間陪她),不然你是不會得到任何好感度的。裴裴很忙,他只有 T 單位的時間可以拿來陪女生,請算出裴裴最多可以得到多少好感度?為了方便輸出,請自動將答案四捨五入至整數位。