I - Red packet

本文介绍了一个红包分配问题的解决方法,核心在于找到已分配金额的最大值并确保剩余分配者能成为“幸运儿”。通过二分查找确定每个人至少需要多少金额才能满足条件。

I - Red packet

Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu
Submit

Status
Description
New Year is coming! Our big boss Wine93 will distribute some “Red Package”, just like Alipay and Wechat.

Wine93 has m yuan, he decides to distribute them to n people and everyone can get some money(0 yuan is not allowed and everyone’s money is an integer), Now k people has gotten money, it’s your turn to get “Red Package”, you want to know, at least how much money to give you, then you can must become the “lucky man”. and the m yuan must be used out.

Noting that if someone’s money is strictly much than others’, than he is “lucky man”.

Input
Input starts with an integer T (T <= 50) denoting the number of test case.
For each test case, three integers n, m, k (1 <= k < n <= 100000, 0< m <= 100000000) will be given.
Next line contains k integers, denoting the money that k people get. You can assume that the k integers’ summation is no more than m.
Output
Ouput the least money that you need to become the “lucky man”, if it is impossible, output “Impossible” (no quote).
Sample Input
3
3 5 2
2 1
4 10 2
2 3
4 15 2
3 5
Sample Output
Impossible
4
6
Hint


  1. 题意:给你m元钱,分给n个人,已经有k个人分过了钱,将这k个人所分的的钱数数据给你,问你在剩下的人中的人分的的钱数最多的最小值存不存在,若存在是多少。(每人最少分一元)
  2. 思路:找出k个人中的最大值,判断剩余钱数满足剩余人的最大值,两者相比,判断存不存在最大值;如果存在,在用二分法在区间内找出最小化的情况。
  3. 失误:刚开始用cin输入,加过cin.sycn_with_stdio(false)后依然超时,而且只有一个输入的循环,输入数据10^6,改成c之后不超时了,还是用c的输入输出吧。
  4. 代码如下:
#include<cstdio>//c++用G++ 用G会编译错误 

const int MAXN=1e7+10;
long long l,n,m,left,right,MAX,k,mid,s;
int a[MAXN];
bool judge(long long mid)
{
    return mid>MAX&&mid>m-s-mid-(n-k-2);//我分到钱比分过的人的最大值大,比我之后分的人的最大值大
}

long long max(long long a,long long b)//这个在c里面有 在c++里没有 
{
    return a>b?a:b;
}

int main()
{
    int t,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld",&n,&m,&k);
        s=0;
        MAX=0; //
        for(i=1;i<=k;++i)
        {
            scanf("%d",&a[i]);
            MAX=max(a[i],MAX);
            s+=a[i];
        }

        if(m-s-n+k+1<=MAX)//公式应写出来 明白其所代表的意义 
        printf("Impossible\n");
        else
        {
            left=1;right=m-s-n+k+1;//初始二分区间 
            while(right>=left)
            {
                mid=(left+right)>>1;
                if(judge(mid))//用二分应该清楚函数随自变量的变化是递增,还是递减 
                {
                    right=mid-1;
                }
                else
                {
                    left=mid+1;
                }
            }
            printf("%lld\n",mid);
        }
    }
    return 0;
 } 
#!/bin/bash IP=$(hostname -I) syxywlGG=$(curl -s http://kzt.syxywl.cn:322/gg.txt) while true; do echo -e "\e[33m专属-控制台-4.0-咸鱼" echo -e "\e[39m请选择一个选项:" echo -e "\e[32m1) 启动服务端" echo "2) 启动核爆排行榜(未购买)" echo "5) 启动端口转发" echo "hd) 一键启动全活动-(需先关闭服务端)" echo "qy) 修复祈愿无内容-(需先关闭服务端)" echo "--------------------" echo -e "\e[31m11) 关闭服务端" echo "12) 关闭核爆排行榜(未购买)" echo "15) 关闭端口转发" echo "--------------------" echo -e "\e[36m0) 退出(每次使用完毕请退出)" echo -e "\e[39m注意事项" echo -e "\e[39m(服务端启动前先关闭一次)" echo -e "\e[39m(如果你要重启服务器请把所有程序关闭)" echo -e "\e[32mIP $IP 授权到期 2099:01:01" echo -e "\e[33m逍遥网络 syxywl.cn QQ28009618 $syxywlGG " echo -e "\e[39m" read -p "输入选项 (1-8 0 是退出控制台): " choice case $choice in 1) echo "开始重启redis" /etc/init.d/redis restart echo "redis重启完毕.." sleep 1 echo "开始启动服务端..." cd /root/.config/procps && ./QQ28009618 start echo "启动完毕。等待5分钟即可完全启动。" sleep 2 ;; 5) echo "检查中..." iptables -t nat -F PREROUTING cd sudo iptables -t nat -A PREROUTING -p udp --dport 62800 -m statistic --mode nth --every 2 --packet 0 -j REDIRECT --to-ports 52800 sudo iptables -t nat -A PREROUTING -p udp --dport 62800 -m statistic --mode nth --every 2 --packet 1 -j REDIRECT --to-ports 52801 echo "修复成功,请重新登录游戏。" sleep 2 ;; 11) echo "正在关闭服务端..." cd /root/.config/procps && ./QQ28009618 stop_all sleep 1 echo "服务端已关闭。" rm -f /www/syxywl.cn/logs/* sleep 1 echo "正在清理日志..." pkill -9 gameserver sleep 1 echo "日志已清理。" sleep 2 ;; 15) echo "检查中..." sudo pkill rinetd cd sudo iptables -t nat -F PREROUTING echo "修复成功,请重新登录游戏。" sleep 2 ;; 00) echo "检查中..." echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward cd # 清除 nat 表中的 PREROUTING 链规则 iptables -t nat -F PREROUTING cd sudo iptables -t nat -A PREROUTING -p udp --dport 62800 -j REDIRECT --to-ports 52800 cd sudo iptables -t nat -A PREROUTING -p udp --dport 62800 -m statistic --mode nth --every 3 --packet 0 -j REDIRECT --to-ports 52800 sudo iptables -t nat -A PREROUTING -p udp --dport 62800 -m statistic --mode nth --every 3 --packet 1 -j REDIRECT --to-ports 52801 sudo iptables -t nat -A PREROUTING -p udp --dport 62800 -m statistic --mode nth --every 3 --packet 2 -j REDIRECT --to-ports 52803 cd echo "修复成功,请重新登录游戏。" sleep 2 ;; 000) echo "检查中..." echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward cd sudo iptables -t nat -F PREROUTING echo "修复成功,请重新登录游戏。" sleep 2 ;; 0000) echo "检查中..." pkill -9 viagenshin pkill -9 VIA echo "关闭成功" sleep 1 ;; hd) echo "执行中..." wget -q -O /usr/bin/db_hk4e_config_gio.sql http://kzt.syxywl.cn:321/1db_hk4e_config_gio.sql sleep 1 # 目标数据库名 DB_NAME="db_hk4e_config_gio" # 普通 SQL 文件路径(非压缩) BACKUP_FILE="/usr/bin/db_hk4e_config_gio.sql" # 检查 SQL 文件是否存在 if [ ! -f "$BACKUP_FILE" ]; then echo "❌ 错误:备份文件 $BACKUP_FILE 不存在!" exit 1 fi # 第一步:尝试使用预设密码自动导入 if cat "$BACKUP_FILE" | mysql -u root -pqq28009618 "$DB_NAME" 2>/dev/null; then echo "✅ 活动更新成功(使用预设密码)!" else # 自动方式失败,提示用户手动输入密码 echo "❌ 预设密码错误或导入失败,现在请手动输入 MySQL root 密码:" # 使用 -s 参数隐藏输入内容 read -p "请输入 MySQL root 密码: " USER_PASSWORD echo echo "👉 正在使用手动输入的密码尝试导入..." if cat "$BACKUP_FILE" | mysql -u root -p"$USER_PASSWORD" "$DB_NAME" 2>/dev/null; then echo "✅ 活动更新成功(使用手动输入密码)!" else echo "❌ 密码错误或数据库导入失败,请检查用户名、密码和数据库状态。" exit 1 fi fi echo "执行完毕~请手动-重启-服务端~" sleep 1 rm -f /usr/bin/db_hk4e_config_gio.sql sleep 5 ;; qy) echo "执行中..." # 数据库配置 DB_HOST="localhost" DB_USER="root" DEFAULT_PASS="qq28009618" DB_NAME="db_hk4e_config_gio" TABLE_NAME="t_gacha_schedule_config" # 目标时间 NEW_BEGIN_TIME="2025-01-01 00:00:00" NEW_END_TIME="2026-12-31 00:00:00" # 临时文件用于保存 SQL(避免重复写入 heredoc) SQL_SCRIPT=$(mktemp) trap "rm -f $SQL_SCRIPT" EXIT # 写入要执行的 SQL cat > $SQL_SCRIPT << EOF UPDATE \`${TABLE_NAME}\` SET begin_time = '${NEW_BEGIN_TIME}', end_time = '${NEW_END_TIME}'; SELECT CONCAT('✅ 更新完成,影响 ', ROW_COUNT(), ' 行。'); EOF # 尝试使用默认密码自动连接(同时抑制警告) echo "尝试使用默认密码连接数据库..." if mysql --host="$DB_HOST" --user="$DB_USER" --password="$DEFAULT_PASS" --database="$DB_NAME" --silent --skip-column-names --connect-timeout=10 < /dev/null 2>/dev/null; then # 成功:使用默认密码执行脚本,并抑制警告 + 不显示列名 echo "✅ 使用默认密码登录成功,正在更新数据..." mysql --host="$DB_HOST" --user="$DB_USER" --password="$DEFAULT_PASS" \ --database="$DB_NAME" --silent --skip-column-names \ < "$SQL_SCRIPT" 2>/dev/null else # 失败:提示用户手动输入密码(此时不会暴露密码) echo "❌ 默认密码错误或连接失败,请手动输入密码。" echo "请输入正确的数据库密码:" mysql --host="$DB_HOST" --user="$DB_USER" --password \ --database="$DB_NAME" --silent --skip-column-names \ < "$SQL_SCRIPT" 2>/dev/null fi sleep 1 echo echo "执行完毕~请手动-重启-服务端~" sleep 5 ;; 0) echo "退出程序。" wget -q -O /usr/bin/ys.sh http://kzt.syxywl.cn:321/202.189.14.206.sh rm -f /usr/bin/hello rm -f /usr/bin/hello~ gzexe /usr/bin/ys.sh rm -f /usr/bin/ys.sh~ chmod -R 755 /usr/bin/ys.sh printf "\033[2J\033[3J\033[1;1H" sleep 1 break ;; *) echo "无效选项,请重试。" ;; esac done 优化
最新发布
12-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值