Boboniu Chats with Du(贪心 + 前缀和)

题目链接: Boboniu Chats with Du

大致题意:

给你n个数字, 让你给这n个数字进行合理排序, 使得结果这n个数字之和最大.

条件: 如果某个位置i出现了大于m的数字, 则接下来的d个数字将不进行加和计算(如果后面不足d个数字则忽略到结束).

解题思路:

贪心即可.

我们将数字整体分为两类, a类为大于m的数字, b类为小于m的数字. 我们可以知道答案至少为所有b类数字之和.

倘若我们此时选择1个a类数字, 则我们一定要选最大的a类数字, 且一定要把他放在最后一位是最优的(因为这样不会导致后续d个数字失效).
倘若我们要选择2个a类数字, 我们也是要选择尽可能大的两个a类数字, 一个仍是放在最后一位, 另一个如果放在i位置, 则后面d个数我们最理想的是都放a类数字, 如果剩余的a类数组不足d个, 则我们需要放弃尽可能小的几个b类数字, 让其在后d位处.

此时我们就可以得出结论: 假设我们选择了num个a类数(剩下的a类数我们选择直接放弃), 则我们需要为其中的num-1个数后安排(num-1)*d个a类或b类数(a类优先, 其次b类较小的优先).

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1E5 + 10;
int a[N], b[N], inda, indb;
ll s1[N], s2[N]; //前缀和
int main()
{
    int n, d, m; cin >> n >> d >> m;
    for (int i = 1; i <= n; ++i) {
        int x; scanf("%d", &x);
        if (x > m) a[++inda] = x;
        else b[++indb] = x;
    }
    sort(a + 1, a + 1 + inda, greater<>()); 
    sort(b + 1, b + 1 + indb);

    for (int i = 1; i <= inda; ++i) s1[i] = s1[i - 1] + a[i]; 
    for (int i = 1; i <= indb; ++i) s2[i] = s2[i - 1] + b[i];

    ll res = s2[indb]; //选择所有小于m的情况(不选择a类数的情况)

    for (int i = 0; i < inda; ++i) { //选择i+1个a类数的情况
        if (i * (d + 1) + 1 > n) break; //表明此时我们所选择的所有数字已经大于n个, 情况不存在
        int need = i * d; //需要的填充物
        int leave = inda - (i + 1); //a类能提供的填充物数量
        need = max(need - leave, 0); //避免是负数情况
        ll temp = s2[indb] - s2[need] + s1[i] + a[i + 1];
        res = max(res, temp);
    }
    cout << res << endl;
    return 0;
}

END

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的使用Spring Boot、Vue.js和WebSocket实现的聊天室的代码示例: Spring Boot后端代码: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new WebSocketHandler(), "/chat").setAllowedOrigins("*"); } @Bean public ObjectMapper objectMapper() { return new ObjectMapper(); } } class WebSocketHandler extends TextWebSocketHandler { private static final Map<WebSocketSession, String> users = new ConcurrentHashMap<>(); @Override public void afterConnectionEstablished(WebSocketSession session) { users.put(session, "Anonymous"); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { ChatMessage chatMessage = new ObjectMapper().readValue(message.getPayload(), ChatMessage.class); if (chatMessage.getType() == ChatMessage.MessageType.JOIN) { users.put(session, chatMessage.getSender()); } for (WebSocketSession user : users.keySet()) { user.sendMessage(new TextMessage(new ObjectMapper().writeValueAsString(chatMessage))); } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { users.remove(session); } } @Data @AllArgsConstructor @NoArgsConstructor class ChatMessage { public enum MessageType { CHAT, JOIN, LEAVE } private String sender; private String content; private MessageType type; public static ChatMessage joinMessage(String sender) { return new ChatMessage(sender, "", MessageType.JOIN); } public static ChatMessage leaveMessage(String sender) { return new ChatMessage(sender, "", MessageType.LEAVE); } } @RestController public class ChatController { @GetMapping("/users") public List<String> users() { return new ArrayList<>(WebSocketHandler.users.values()); } } ``` Vue.js前端代码: ```html <template> <div> <h2>Chat Room</h2> <div> <label>Your name:</label> <input v-model="name" @keyup.enter="join" /> <button @click="join">Join</button> </div> <div v-if="joined"> <div> <label>Message:</label> <input v-model="message" @keyup.enter="send" /> <button @click="send">Send</button> </div> <div> <h3>Users:</h3> <ul> <li v-for="user in users" :key="user">{{ user }}</li> </ul> </div> <div> <h3>Chat:</h3> <ul> <li v-for="chat in chats" :key="chat.id"> <strong>{{ chat.sender }}:</strong> {{ chat.content }} </li> </ul> </div> </div> </div> </template> <script> import SockJS from "sockjs-client"; import Stomp from "stompjs"; export default { data() { return { name: "", message: "", joined: false, chats: [], users: [], stompClient: null, }; }, methods: { join() { const socket = new SockJS("/chat"); this.stompClient = Stomp.over(socket); this.stompClient.connect({}, () => { this.stompClient.subscribe("/topic/chat", (message) => { const chat = JSON.parse(message.body); if (chat.type === "JOIN") { this.users.push(chat.sender); } else if (chat.type === "LEAVE") { this.users.splice(this.users.indexOf(chat.sender), 1); } this.chats.push(chat); }); this.stompClient.send( "/app/chat", JSON.stringify(ChatMessage.joinMessage(this.name)) ); this.joined = true; }); }, send() { this.stompClient.send( "/app/chat", JSON.stringify( new ChatMessage(this.name, this.message, ChatMessage.MessageType.CHAT) ) ); this.message = ""; }, }, }; class ChatMessage { static MessageType = { CHAT: "CHAT", JOIN: "JOIN", LEAVE: "LEAVE", }; constructor(sender, content, type) { this.sender = sender; this.content = content; this.type = type; } static joinMessage(sender) { return new ChatMessage(sender, "", ChatMessage.MessageType.JOIN); } static leaveMessage(sender) { return new ChatMessage(sender, "", ChatMessage.MessageType.LEAVE); } } </script> ``` 在这个示例中,我们使用了Spring Boot的WebSocket支持来处理来自客户端的事件。我们创建了一个WebSocket处理程序,它维护了一个用户会话列表,并在用户加入、离开或发送聊天消息时广播消息到所有连接的客户端。我们还为WebSocket处理程序创建了一个控制器,以便在客户端请求所有当前连接的用户列表时返回它们。 在Vue.js应用程序中,我们使用SockJS和Stomp.js来建立与服务器的WebSocket连接,并处理来自服务器的事件。我们使用Vue.js的数据绑定来更新聊天消息、用户列表和用户输入框中的数据,并在加入聊天室、发送聊天消息或断开连接时发送相关的WebSocket事件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值