11.6训练赛补题

这篇博客介绍了两个经典的算法问题:B-矩阵消除游戏的二进制枚举解法和N皇后问题的深度优先搜索策略。在B-矩阵消除游戏中,通过枚举选择行的组合,求得最大和;而在N皇后问题中,利用回溯法确保皇后在棋盘上互不攻击。文章提供了详细的C++代码实现,并展示了如何检查解决方案的有效性。
摘要由CSDN通过智能技术生成

B-矩阵消除游戏

二进制枚举,不会,贴个别人的代码

题解

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int lie[20];//存放可以选的列的和, lie[1]表示第一列的和(除去选了的行)
int a[20][20];
int ct;
int calc(int x){
    int sum=0;
    for(int i=1;i<=n;i++){
        if(((x>>(i-1))&1)==1){//计算选择的行
            ct++;
            for(int j=1;j<=m;j++)
                sum+=a[i][j];
        }else{
            for(int j=1;j<=m;j++)//把没有被选中的行,其中的每列都计算一下
                lie[j]+=a[i][j];
        }
    }
    return sum;
}
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin>>n>>m>>k;
    int sum=0;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        cin>>a[i][j],sum+=a[i][j];
    if(k>=n||k>=m){//全都可以选的情况
        cout<<sum; return 0;
    }
    int ans=0;
    for(int i=0;i<=((1<<n)-1);i++){
        ct=0;
        memset(lie,0,sizeof(lie));//记住清零
        int sum=calc(i);
        int rest=k-ct;
        if(rest<0||rest>m) continue;
        sort(lie+1,lie+1+m,greater<int>());
        for(int i=1;i<=rest;i++){
            sum+=lie[i];
        }
        ans=max(ans,sum);
    }
    cout<<ans;
    return 0;
}

C-[USACO 2010 Feb S]Chocolate Eating

#include<iostream>
#include<algorithm>

using namespace std;

typedef long long ll;

const int N = 50010;

int n, d;
ll g[N], q[N];

bool check(ll k) {
	ll s = 0;
	int j = 1;
	for (int i = 1; i <= d; i++) {
		s /= 2;
		while (s < k) {
			if (j > n) return false;
			q[j] = i;
			s += g[j++];
		}
	}
	if (j <= n) {
		for (ll i = j; i <= n; i++) q[i] = d;
	}
	return true;
}

int main() {
	cin >> n >> d;
	ll l = 1, r = 0;
	for (int i = 1; i <= n; i++) {
		cin >> g[i];
		q[i] = 0;
		r += g[i];
	}
	
	while (l < r) {
		ll mid = (l + r + 1) >> 1;
		if (check(mid)) l = mid;//往右
		else r = mid - 1;//往左
	}
//最后一遍check的数组里不一定是最终答案,所以要再用check走一遍正确答案来更新数组
	check(l);
	cout << l << endl;
	for (int i = 1; i <= n; i++) {
		//if (q[i]) cout << q[i] << endl;
		//else cout << d << endl;
		cout << q[i] << endl;
	}
	return 0;
}

E-N皇后问题

#include<iostream>

using namespace std;

const int N = 30;

int n, ans = 0;
//col记录每列,dg记录对角线,udg记录反对角线
bool col[N], dg[N], udg[N];

void dfs(int u) {
	if (u == n) {
		ans++;
		return;
	}
	for (int i = 0; i < n; i++) {
        //y=x+b-->b=y-x(加n防止越界), y=-x+b-->b=x+y
		if (!col[i] && !dg[u + i] && !udg[n - u + i]) {
			col[i] = dg[u + i] = udg[n - u + i] = true;
			dfs(u + 1);
			col[i] = dg[u + i] = udg[n - u + i] = false;
		}
	}
}
int main() {
	cin >> n;
	dfs(0);
	cout << ans << endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 11.6题要求我们实现一个简单的Java虚拟机,可以执行一些简单的Java程序。具体来说,我们需要实现以下几个部分: 1. 读取Java字节码文件,将其解析成指令序列。 2. 实现一个虚拟机栈,用于存储局部变量和操作数栈。 3. 实现指令集,包括常量加载、算术运算、比较运算、跳转等指令。 4. 执行指令序列,模拟Java程序的执行过程。 在实现过程中,我们需要注意一些细节问题,比如指令的操作数类型、栈帧的管理、异常处理等。此外,我们还需要考虑性能问题,比如如何优化指令的执行速度、如何减少内存占用等。 总之,实现一个Java虚拟机是一项非常复杂的任务,需要深入理解Java语言和计算机系统的原理。但是,通过这个练习,我们可以更好地理解Java程序的执行过程,提高我们的编程能力。 ### 回答2: Java黑皮书第11章11.6主要探讨了Java中的异常处理机制,以及如何自定义异常。本章节的核心知识点包括: 1. 异常的概念:异常是在程序执行期间发生的错误或其他意外情况,它打断了正常的程序执行流程。 2. 异常的分类:Java中将异常分为Checked异常和Unchecked异常。Checked异常在编译期间就必须捕获处理,否则编译器会提示错误。Unchecked异常则不需要在编译期间捕获,但程序在运行时会抛出异常。 3. 异常处理机制:Java提供了try-catch语句用于捕获和处理异常。try块中放置可能会抛出异常的代码,catch块中处理异常的代码。 4. 自定义异常:Java允许我们自定义异常类,继承自Exception或RuntimeException,也可以添加自己的字段、方法等。 这一章节的课后题主要是通过代码实践来加深对异常处理机制的理解,以及练习自定义异常类。有一道比较经典的题目是编写一个自定义异常类,并在程序中抛出这个异常。这个题目的思路可以参考以下步骤: 1. 创建一个自定义异常类,继承自Exception或RuntimeException。 2. 在构造方法中传入异常信息,然后调用父类的构造方法。 3. 在程序的某个地方,使用throw关键字抛出自定义异常。 4. 在主程序中使用try-catch语句捕获自定义异常,在catch块中处理异常。 例如,我们可以创建一个自定义异常类MyException,并在程序的某个地方抛出这个异常: class MyException extends RuntimeException{ public MyException(String message){ super(message); } } public class Main{ public static void main(String[] args){ try{ throw new MyException("这是一个自定义异常"); }catch(MyException e){ System.out.println("捕获到自定义异常:" + e.getMessage()); } } } 在这个例子中,我们创建了一个自定义异常类MyException,它继承自RuntimeException。在程序的try块中,我们使用throw关键字抛出这个异常。在主程序中,我们使用try-catch语句捕获这个自定义异常,并在catch块中处理异常并输出异常信息。 总的来说,Java黑皮书第11章11.6是一个非常重要的章节,掌握异常处理机制和自定义异常类的知识对于Java程序开发至关重要。在实际的开发中,我们需要根据实际情况进行异常处理,使程序更加健壮和可靠。 ### 回答3: 11.6题是要求实现一个基于协程(Coroutine)的简单HTTP服务器。协程是一种比线程更轻量级的并发机制,可以在单个线程中实现多个协程的交替执行,类似于CPU在操作系统中的任务切换。HTTP服务器是指接受HTTP请求并返回HTTP响应的程序或服务。 在实现基于协程的HTTP服务器时,我们需要使用Java的协程库,比如Quasar,ByteBuddy或Kilim。在这个服务器中,每个HTTP请求都被视为一个协程,并且服务器需要实现以下功能: 1. 监听并接受HTTP请求:服务器需要启动一个监听端口,以接受客户端的HTTP请求,并将其转变为协程来处理。 2. 解析HTTP请求:对于每个接受的HTTP请求,服务器需要解析其请求头和主体,以确定请求类型、请求路径、请求方法等信息。 3. 处理HTTP请求:服务器需要根据请求的类型和路径,决定如何处理每个HTTP请求。常见的处理方式是返回文件内容、执行代码、跳转到其它页面等。在协程处理HTTP请求时,服务器可以暂停当前协程,等待文件读取、代码执行等耗时操作完成后,再恢复当前协程继续执行。 4. 返回HTTP响应:服务器需要将处理结果封装成HTTP响应,包括响应头和响应主体内容,并将其发送回客户端。 在实现这个服务器时,需要注意以下几点: 1. Java协程库的选择:Java提供了不同的协程库,每个库有不同的优缺点。要根据实际需求选择适合的协程库,并掌握其基本使用方法。 2. HTTP请求的解析:需要熟悉HTTP协议的请求格式和规范,以正确解析每个请求,并提取需要的信息。 3. 耗时操作的处理:在处理HTTP请求时,可能会遇到需要,等待文件读取、代码执行等耗时操作。要注意在这些操作上暂停当前协程,并在操作完成后恢复协程的执行。 4. 程序的安全性:在实现HTTP服务器时,要注意相关的安全问题,比如防止跨站脚本(XSS)攻击、拒绝服务(DOS)攻击、SQL注入等。 总之,基于协程实现HTTP服务器是一项复杂的工作,需要综合掌握HTTP协议、Java协程库、耗时操作处理、程序安全等多个方面的知识。如果熟练掌握这些技能,就可以实现高效、安全、稳定的HTTP服务器,满足不同场景下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值