数字(number)

题目描述
LYK收到了n个数字作为新年礼物,第i个数字的值为ai。
除了这些数字,还有一个信封,上面写着:“如果你能从这n个数中选出k个数使得它们的和为奇数,那么我将会满足你一个愿望!”
LYK觉得这不可能,此处必有玄机,于是它想在满足信封里的要求的情况下满足选出的数字的和最大。LYK想知道最大是多少。
当然不止这一年LYK收到了礼物,以后的每一年都会有这样的一个礼物,具体的,总共有m年。神奇的是这些数字并没有发生变化,而k发生了变化,LYK想知道所有年的答案是多少。
可能会存在写信人在骗它,也就是说不存在一个可行的方案,此时输出-1就可以了。

输入格式(number.in)
第一行一个数n表示LYK收到的数字个数。
第二行n个数ai表示每个数字。
第三行一个数m。
第四行m个数表示每一年的k值。

输出格式(number.out)
m行,每行输出一个答案。

输入样例
3
1 2 2
3
1 2 3

输出样例
1
3
5

数据范围
对于30%的数据n,m<=100。
对于60%的数据n,m<=1000。
对于另外10%的数据所有ai均为奇数。
对于再另外10%的数据所有ai均为偶数。
对于90%的数据n,m<=100000。
对于100%的数据n,m<=1000000,1<=ai<=n+2。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
int a[1000],qj[1000],qo[1000],hj[1000],ho[1000],s[1000],ans[1000];
int my_comp(int a,int b)
{
    if(a>b) return 1;
    return 0;
}
int main()
{ 
 int n,i,j,k,m;

 scanf("%d",&n);

 for(i=1;i<=n;i++)
  scanf("%d",&a[i]);

 sort(a+1,a+n+1,my_comp);//降序排序


 for(i=1;i<=n;i++)
  {
    if (a[i]%2==0) qo[i]=i; else qo[i]=qo[i-1];//1——i中最大的偶数
    if (a[i]%2==1) qj[i]=i; else qj[i]=qj[i-1];//1——i中最大的奇数
    s[i]=s[i-1]+a[i]; 
  }
 for(i=n;i>=1;i--)
 {
    if (a[i]%2==0) ho[i]=i; else ho[i]=ho[i+1];//i——n中最小的偶数
    if (a[i]%2==1) hj[i]=i; else hj[i]=hj[i+1];//i——n中最小的奇数
 }

 scanf("%d",&m);

 for(i=1;i<=n;i++)
 {
    ans[i]=-1;//如果无法找到解就输出-1
    if (s[i]%2==1) ans[i]=s[i]; 
    else
    {
     if (qj[i] && ho[i+1]) ans[i]=max(ans[i],s[i]-a[qj[i]]+a[ho[i+1]]);
     if (qo[i] && hj[i+1]) ans[i]=max(ans[i],s[i]-a[qo[i]]+a[hj[i+1]]);//寻找最优解
    }
 }

 for(i=1;i<=m;i++)
 {
    scanf("%d",&k);

    printf("%d\n",ans[k]);//反正我不会读入输出优化
 }
 return 0;
}

转载于:https://www.cnblogs.com/ht008/p/6819851.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
服务端代码: ```python import random import socket # 生成随机数target target = random.randint(1, 99) print("随机数为:", target) # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname() # 设置端口号 port = 9999 # 绑定端口号 server_socket.bind((host, port)) # 设置最大连接数,超过后排队 server_socket.listen(1) print("等待客户端连接...") while True: # 建立客户端连接 client_socket, client_address = server_socket.accept() print("连接地址:", client_address) while True: # 接收客户端发送的数据 data = client_socket.recv(1024).decode() if not data: break # 将接收到的数据转换成数字 number = int(data) # 比较number和target if number < target: msg = "猜小了,请继续猜" elif number > target: msg = "猜大了,请继续猜" else: msg = "恭喜你猜中了!" break # 发送提示信息给客户端 client_socket.send(msg.encode()) # 关闭连接 client_socket.close() print("连接关闭") ``` 客户端代码: ```python import socket # 创建socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname() # 设置端口号 port = 9999 # 连接服务,指定主机和端口号 client_socket.connect((host, port)) while True: # 从键盘输入猜测数字 number = input("请输入一个1-99之间的数字:") # 发送猜测数字给服务端 client_socket.send(number.encode()) # 接收服务端发送的提示信息 data = client_socket.recv(1024).decode() # 输出提示信息 print(data) # 如果猜中了,结束循环 if "恭喜你猜中了" in data: break # 关闭连接 client_socket.close() ``` 使用方法: 首先运行服务端代码,等待客户端连接。然后运行客户端代码,输入猜测数字即可开始游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值