当前位置: 代码迷 >> 综合 >> 水题 nbut1651 Red packet
  详细解决方案

水题 nbut1651 Red packet

热度:28   发布时间:2023-12-14 03:24:30.0

传送门:点击打开链接

题意:n个人,共m元,已经分了k份红包出去了,并告诉你k份红包的钱数。

问你至少需要拿多少钱,才能当运气王。

思路:这个思路要清晰一点,,因为有很多东西需要特判,有种比较好的办法,就是确定l和r,表示你如果需要当运气王,那么你获得的钱应该在区间[l,r]内,然后再缩小区间,看是否存在这样的区间,就ok了

#include<map>
#include<set>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<string>
#include<vector>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<algorithm>
#include<functional>
#define fuck(x) cout<<"["<<x<<"]"
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)
using namespace std;
typedef long long LL;
typedef pair<int, int>PII;const int MX = 2e5 + 20;
const int mod = 1e9 + 9;
const int INF = 0x3f3f3f3f;int main() {int T; //FIN;scanf("%d", &T);while(T--) {int n, m, k, res, Max = 0;scanf("%d%d%d", &n, &m, &k);res = m;for(int i = 1; i <= k; i++) {int t; scanf("%d", &t);Max = max(Max, t);res -= t;}int l, r;if(n - k == 1) {l = r = res;} else {if(n - k == res) r = 0;else {l = (res - (n - k - 2)) / 2 + 1;r = res - (n - k - 1);}}l = max(l, Max + 1);if(l <= r) printf("%d\n", l);else printf("Impossible\n");}return 0;
}