贪心。
从大到小排序之后进行模拟,注意$n=1$和$n=0$的情况。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <cmath> using namespace std; int n,m; int a[100010]; bool cmp(int x,int y) { return x>y; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&a[i]); sort(a+1,a+1+m,cmp); int now = n; if(n==0||n==1) { printf("0 "); return 0; } for(int i=1;i<=m;i++) { if(a[i] <= 0) break; if(a[i]<now) { now = now - a[i]; a[i+1]--; } else { now = 0; printf("%d ",i); break; } } if(now!=0) { printf("Impossible "); } return 0; }