八中魔法师

魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品。花费c_ij元,魔术师就会告诉你杯子i,i+1,…,j底下藏有球的总数的奇偶性。采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球?

Input

第一行一个整数n(1<=n<=2000)。

第i+1行(1<=i<=n)有n+1-i个整数,表示每一种询问所需的花费。其中c_ij(对区间[i,j]进行询问的费用,1<=i<=j<=n,1<=c_ij<=10^9)为第i+1行第j+1-i个数。

Output

输出一个整数,表示最少花费。

Sample Input

5

1 2 3 4 5

4 3 2 1

3 4 5

2 1

5

Sample Output

7

解析:

确定每个位置是否有小球等价于确定所有的前缀的奇偶性。

对于前缀i和前缀i+1:

如果奇偶相同,i不存在小球。

如果奇偶不同,i存在小球。

于是我们只需要用n次询问,将n+1个点连通,就可推出点与点之间相互的关系。

考虑到本题为稠密图,故采用Prim算法来求最小生成树。

代码如下:

#include<bits/stdc++.h>
using namespace std;
bool f[2010];
int n,v[2010][2010],d[2010],m,minn;
long long ans;
int main() {
    scanf("%d",&n);
    for(inti=1;i<=n;i++)
        for(intj=i;j<=n;j++)
            scanf("%d",&v[i-1][j]),v[j][i-1]=v[i-1][j];
    for(inti=1;i<=n;i++) d[i]=1e9;
    d[0]=0;
    while(1) {
        minn=1e9;
        for(int i=0;i<=n;i++)
        if(!f[i]&&d[i]<minn)
            minn=d[i],m=i;
        if(minn==1e9) break;
        ans+=minn;
        f[m]=1;
        for(int i=0;i<=n;i++)
            if(v[m][i]<d[i]&&!f[i])
                d[i]=v[m][i];       
    }
    printf("%lld\n",ans);
    return 0;
}

但也可以用Kruskal算法:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int fa[20000010];
int tot;
struct node {
	int x,y;
	long long val;
} a[20000010];
long long ans;
int find(int x) {
	if(x!=fa[x]) fa[x]=find(fa[x]);
	return fa[x];
}
bool cmp(node x,node y) {
	return x.val<y.val;
}
signed main() {
	cin>>n;
	for(int i=1; i<=n; i++) fa[i]=i;
	for(int i=1; i<=n; i++) {
		for(int j=i; j<=n; j++) {
			tot++;
			a[tot].x=i-1;
			a[tot].y=j;
			cin>>a[tot].val;
		}
	}
	sort(a+1,a+tot+1,cmp);
	int sum=0;
	for(int i=1; i<=tot; i++) {
		int x=a[i].x,y=a[i].y,val=a[i].val;
		int fx=find(x),fy=find(y);
		if(fx!=fy) {
			sum++;
			fa[fx]=fy;
			ans+=val;
		}
		if(sum>=n) break;
	}
	cout<<ans<<endl;

	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
作为一个单片机编程魔法师,高级裸编思想是非常重要的。裸编指的是在没有操作系统和库函数的情况下,直接与硬件交互的编程方式。这种编程思想要求程序员对硬件的了解深入,能够直接操作寄存器和外设,并且高效地利用资源。 在高级裸编思想中,以下几个方面是需要重点关注的: 1. 精确的时序控制:单片机的性能通常有限,程序员需要掌握精确的时序控制来保证程序的正确执行。这包括正确设置时钟频率、延时函数的编写以及处理中断等。 2. 低功耗设计:对于一些功耗敏感的应用,如电池供电的设备,高级裸编思想能够帮助程序员优化功耗。这包括合理地使用休眠模式、关闭不必要的外设以及优化算法等。 3. 高效的资源利用:在裸编环境下,程序员需要合理地利用有限的资源。这包括内存的管理、优化代码大小和速度、合理分配处理器时间等。 4. 硬件抽象和封装:虽然裸编强调直接与硬件交互,但在一些复杂的项目中,适当的硬件抽象和封装可以提高代码的可读性和可维护性。程序员需要根据具体项目情况,权衡硬件的直接操作和抽象封装的程度。 总之,高级裸编思想是单片机编程魔法师必备的技能。通过深入理解硬件、精确的时序控制、低功耗设计和高效的资源利用,程序员可以编写出高性能、可靠且节能的单片机应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值