題目給出一系列數字,然後問哪個數字是從小到大排在第幾的,重復出現算第一個。
數據范圍為10000,不大,完全可以暴力,sort不會超時。
但是由於以前做比賽時也遇到這種題目,沒注意看數據范圍,然後暴力被hack了。之後就學會了計數排序了。
這題也用計數排序做,挺快的,代碼也不長。
代碼:
#include <cstdio> #include <cstring> const int maxn = 10001; int num[maxn], s[maxn]; int main() { int n, q, tmp, m = 0, cnt = 0; while (scanf("%d%d", &n, &q) && (n || q)) { printf("CASE# %d:\n", ++cnt); memset(num, 0, sizeof(num)); //init memset(s, 0, sizeof(s)); for (int i = 1; i <= n; i++) { //input scanf("%d", &tmp); if (m < tmp) m = tmp; num[tmp]++; } int sum = 0; for (int i = 1; i <= m; i++) //calc the sum s[i] = s[i - 1] + num[i]; for (int i = 1; i <= q; i++) { //output scanf("%d", &tmp); if (num[tmp]) printf("%d found at %d\n", tmp, s[tmp - 1] + 1); else printf("%d not found\n", tmp); } } return 0; }