2018青島區域賽J:Books
阿新 • • 發佈:2018-11-12
從左到右一次掃n本書,如果當前錢包裡面的錢大於書的價錢,就買下來(必須買),問最多能帶多少錢,錢數必須是非負整數,如果沒有方案,就輸出Impossible,如果可以帶無限的錢,就輸出Richman.
先找出0的個數,因為0元的是必須要買的,如果0的數量大於需要的數量,輸出impossible。當n=m的時候可以帶無限的錢,輸出Richman。如果0的數量小於需要的數量,就從頭買書,直到最後一本,再從這一本開始從和麵找一本價錢最低的,加到總價錢裡面。
#include <stdio.h> long long a[100010]; int main() { long long t, x, k, n, m, minn, s, sum, ans, i; scanf("%lld",&t); while (t--) { ans=0; sum=0; minn=99999999999; scanf("%lld%lld", &n, &m); for (i = 0; i < n; i++) { scanf("%lld", &a[i]); if (a[i]==0) ans++; } if (ans > m) { printf("Impossible\n"); continue; } if(n==m) { printf("Richman\n"); continue; } m-=ans; s=0; for (i = 0; i < n; i++) { if (a[i]==0) continue; s++; if (s <= m) sum+=a[i]; if (s > m) { if (a[i] < minn) minn=a[i]; } } printf("%lld\n", sum+minn-1); } return 0; }