dut周赛第一周

本文精选了算法竞赛中的经典题目,涵盖了从简单的遍历到复杂的动态规划、概率论及组合游戏理论,通过详细解析帮助读者深入理解算法设计与实现。

没午睡头昏脑胀把能踩的坑都踩了....签到题都没写完(读题和代码能力一直是短板ORZ)

EFG比较水,有人有需求再添加,这里只给代码。J(已补) SG函数还不会...得找个时间学(潼神每次都出SG函数 蓝瘦)。

 

E:判断C的情况  大于10000遍历c的倍数  ,小于10000因为 位数平方和最多9*81  所以遍历c*81*9

    	    			
    #include<bits/stdc++.h>
using namespace std;

int bb(long long g){
	int now=0;
	while(g>0)
	{
		int tmp=g%10;
		now+=tmp*tmp;
		g/=10;
	}
	return now;
}

int main()
{
	long long a,b,c;int ans=0;
	scanf("%lld%lld%lld",&a,&b,&c);
	if(c>10000){
		for(int i=1;(i-1)*c<=b;i++)
		{
			if(bb(i*c)==i&&(i*c>=a)&&(i*c<=b)){
				ans++;
			}
		}
		printf("%d\n",ans);
		return 0;
	}
	long long maxx=81*9*(c+1);
	for(int i=1;i<=maxx;i++)
	{
			if(bb(i)*c==i&&i>=a&&i<=b){
				ans++;
			}
	}
	printf("%d\n",ans);
	
}		
    

F:赢x次的概率(x<12则最后一场一输结束)C(x+2,2)*p^x*(1-p)^3  赢12次以此类推。

    	    			
    #include<bits/stdc++.h>
using namespace std;
		double p;
int cc(int a,int b)
{
	int ans=1;
	for(int i=0;i<b;i++)
	{
		ans*=a-i;
	}
	for(int i=1;i<=b;i++)
	{
		ans/=i;
	}
	return ans;
}
int main()
{

		scanf("%lf",&p);double ans=0;//printf("~%d\n",cc(5,2));
		for(int i=0;i<=11;i++)
		{
			double gg=1;
			double ggg=(1-p)*(1-p)*(1-p);
			for(int j=0;j<i;j++)
			{
				gg*=p;
			}
			ans+=i*cc(i+2,2)*gg*ggg;//printf("%d %d %lf\n",i,cc(i+2,2),ans);
		}
			double gg=1;
			double ggg=(1-p)*(1-p);
			for(int j=0;j<12;j++)
			{
				gg*=p;
			}
			
			ans+=12*cc(12,1)*gg*(1-p);
			ans+=12*cc(13,2)*gg*(1-p)*(1-p);
		//	ans+=12*cc(14,2)*gg*(1-p)*(1-p)*(1-p);
			
			ans+=12*gg;
			printf("%lf",ans);
}		
    

G:维护小于等于L1的最远点和小于等于L2的最远点和小于等于L3的最远点 然后求飞这三个点的最小值

    #include<bits/stdc++.h>
using namespace std;
int ll[10010];
int aa[10010];
int minans[10010];
    int l1,l2,l3,c1,c2,c3;
    int n;
int money(int len)
{
    if(len<=l1) return c1;
    if(len<=l2) return c2;
    if(len<=l3) return c3;
    else return 99999999;
}
int main()
{
 
    scanf("%d%d%d%d%d%d",&l1,&l2,&l3,&c1,&c2,&c3);
    scanf("%d",&n);
    int a,b;
    scanf("%d%d",&a,&b);
    int st,en;
    for(int i=2;i<=n;i++)
    {
        scanf("%d",&aa[i]);
        if(i==a) st=aa[i];
        if(i==b) en=aa[i];
    }
    int n1,n2,n3;
    n1=n2=n3=a;
    for(int i=a+1;i<=b;i++)
    {
        while(aa[i]-aa[n1]>l1&&n1<i-1){
            n1++;
        }
        while(aa[i]-aa[n2]>l2&&n2<i-1){
            n2++;
        }
        while(aa[i]-aa[n3]>l3&&n3<i-1){
            n3++;
        }
        minans[i]=min(minans[n1]+money(aa[i]-aa[n1]),minans[n2]+money(aa[i]-aa[n2]));
        minans[i]=min(minans[i],minans[n3]+money(aa[i]-aa[n3]));
    }
    printf("%d\n",minans[b]);
}

H:

1234: Zeratul与塔防游戏

Time Limit:4000/2000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)
Total Submissions:39   Accepted:6

[Submit][Status][Discuss]

Description

Zeratul有n(1≤n≤10000)n(1≤n≤10000)座防御塔,每个防御塔覆盖[L[i],R[i]][L[i],R[i]],且攻击力为A[i](1≤A[i]≤1000)A[i](1≤A[i]≤1000)。区间[1,m](1≤m≤10000)[1,m](1≤m≤10000)上每个整点有一个防御值,是所有能覆盖到这个点的防御塔的攻击力之和。Zeratul可以给防御塔升级k(0≤k≤109)k(0≤k≤109)次,每次升级可以将一个防御塔的攻击力提高1。同一个防御塔可以被多次升级。

现在Zeratul想知道,[1,m][1,m]上所有整点的最小防御值最大是多少。

 

Input

第一行包括三个整数n,m,kn,m,k,含义见Description。

接下来n行,每行包括三个整数L[i],R[i],A[i](1≤L[i]≤R[i]≤m)L[i],R[i],A[i](1≤L[i]≤R[i]≤m),代表第ii座防御塔的覆盖范围和第ii座防御塔的攻击力。

Output

 一个整数,代表最小的防御值最大是多少。

Sample Input

3 5 3
1 4 5
2 5 1
3 4 1

Sample Output

4

HINT

 

 Sample需要将第2座防御塔加强三次。

 

Source

Zeratul

题解:基本上是2018徐州的H的加强版,二分答案 每个答案从左到右判断每个区间  如果区间攻击值总和小于ans就把包括当前点同时右端点最靠右的区间补到总和为ans为止  包含区间右端点最大值用单调队列维护即可,结构体用法比较奇葩,因为当时徐州就是这么写的ORZ 复杂度o(nlogn)代码有注释。

#include<bits/stdc++.h>
using namespace std;
int n,m,k;

struct node{
	int num;
	int lr;
}no[20020];
int zone[10010][2];//每个区间长度 
int a[10010];//每个区间初始值 
int q[20020];//优先队列 
int sum[20020];//每个区间的等级 
void init()
{
	for(int i=0;i<=n;i++) sum[i]=a[i];
}
int check(int ans)
{
	init();int head=1;int tail=0;
	int nowd=0;//nowd是当前整点的防御值 
	if(ans==0) return 1;
	if(zone[no[1].num][no[1].lr]!=1||zone[no[2*n].num][no[2*n].lr]!=m+1) return 0; //特判一下区间范围有没有包含1和m 删除也能过 
	int use=0;//use表示使用的升级点数 
	for(int i=1;i<=2*n;i++)
	{
		if(no[i].lr==1)//假如是右端点 
		{	
		nowd-=sum[no[i].num];	//剪掉当前区间提供的防御值 
				if(nowd<ans&&zone[no[i].num][1]<=m)//如果剪完后当前节点防御值不到ans 
				{			
					if(zone[q[head]][1]<=zone[no[i].num][no[i].lr])//单调队列 到当前位置前包含的所有区间右端点最大值小于等于当前节点 则无法将此节点增加到ans 
					{
						return 0;
					}
					else{
						sum[q[head]]+=ans-nowd;use+=ans-nowd;nowd=ans;
						if(use>k) return 0;//如果升级点数超过k 
					}
				}					
		}
		if(no[i].lr==0)//如果是左端点 
		{
				nowd+=sum[no[i].num];//加上该区间点数 
			if(head>tail)// 将该区间推入维护右端点最大值的优先队列 
			{
				tail++;q[tail]=no[i].num;
			}
			else{
				while(head<=tail&&zone[no[i].num][1]>=zone[q[tail]][1]){
					tail--;
				}
				tail++;q[tail]=no[i].num;
			}
			if(zone[no[i].num][no[i].lr]!=zone[no[i+1].num][no[i+1].lr])//如果 下一个节点和当前节点位置不同,则应增加该节点的值到ans 
			{
				if(nowd<ans)
				{			
					if(zone[q[head]][1]<=zone[no[i].num][no[i].lr])//如果单调队列队首 (到当前位置前包含的所有区间右端点最大值)小于等于当前节点 则无法将此节点增加到ans 
					{
						return 0;
					}
					else{
						sum[q[head]]+=ans-nowd;use+=ans-nowd;nowd=ans;
						if(use>k) return 0;//如果升级点数超过k 
					}
				}
			}
		}
	}
	return 1;
	
}
int find() //二分答案 
{
    int left = 0;
    int right = k+2000-1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if ((check(mid)^1)>=1) {
            right = mid - 1;
        }
        else {
            left = mid + 1;
        }
    }
    return right;
}
int cmp(node a,node b)//将区间左右端点排序 
{
	if(zone[a.num][a.lr]!=zone[b.num][b.lr])//先按位置大小排序 
	{
		return zone[a.num][a.lr]<zone[b.num][b.lr];
	}
	if(a.lr!=b.lr)//相同位置左端点在前右端点在后 
	{
		return a.lr<b.lr;
	}
	else//相同位置左端点按右端点大小从大到小排 
	{
		return zone[a.num][1]>zone[b.num][1];
	}
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&zone[i][0],&zone[i][1],&a[i]);
		zone[i][1]++;//右端点+1 方便处理 
		no[i*2-1].lr=0;no[i*2-1].num=i;
		no[i*2].lr=1;no[i*2].num=i;
	}
	sort(no+1,no+1+2*n,cmp);
	printf("%d\n",find());
}

 

I:

1235: Zeratul与Kerrigan的情报战

Time Limit:4000/2000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)
Total Submissions:10   Accepted:3

[Submit][Status][Discuss]

Description

Kerrigan在编号为11到n(1≤n≤105)n(1≤n≤105)的星球都分别部署有一些兵力,每个星球的兵力都可以用一个非负整数来表示。这些军队正在准备进攻Protoss的领地。

现在Zeratul得到了一些关于Kerrigan军事行动的情报。Zeratul得到的情报是下面这个形式的:三个整数L,R,V(1≤L≤R≤n,0≤V≤(231−1))L,R,V(1≤L≤R≤n,0≤V≤(231−1)),代表Kerrigan在编号为LL到编号为RR的星球上的兵力的异或为VV。

现在Zeratul想要知道,他可以从这些情报中确定出多少个星球的具体兵力。如果情报是自相矛盾的,输出-1。

 

Input

第一行包括两个整数n,m(1≤m≤100000)n,m(1≤m≤100000),分别代表星球的个数和情报的个数。

接下来m行,每行包括三个整数L,R,V,含义见Description。

Output

一个整数,代表Zeratul可以确定出多少个星球的具体兵力。如果情报出现矛盾,输出-1。

Sample Input

10 3
1 10 7
1 5 4
7 10 1

Sample Output

1

HINT

 

Sample中情报没有出现矛盾,并且Zeratul可以确定6号星球的兵力一定是2。其他星球的兵力均无法确定。

 

Source

Zeratul

[Submit][Status][Web Board]

题解:

经典的权值并查集题  只不过把就和改成求异或和,而且异或优先级比不等于低!!所以不加括号很难查到错在哪里ORZ

代码:

    	    			
    #include <cstdio>

const int maxn = 100000 + 10;

int pre[maxn];
int sum[maxn];    // sum是该节点到其根的异或和,比如说sum[3],前三个的前缀异或和到根 
int find(int x) {
    if (x == pre[x])  return x;
    else {
        int root = find(pre[x]);     // 找到根节点
        sum[x] ^= sum[pre[x]];       // 权值合并,更新
        return pre[x] = root;        // 压缩路径
    }
}
int know[100010];
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
        for(int i = 0; i <= n; i++) {
            pre[i] = i;
            sum[i] = 0;
        }
        int x, y;
        int s;
        int ans = 0;
        while(m--) {
            scanf("%d%d%d", &x, &y, &s);
            x--;        //表示前x-1个数的前缀异或和 与 前y个数异或和 的关系 
            int fx = find(x);
            int fy = find(y);
            if (fx != fy) {
                pre[fy] = fx;
                sum[fy] = sum[x] ^ sum[y] ^ s;
            }
            else if ((sum[y] ^ sum[x] )!= s)//!!!这里^优先级小于!=  所以用和的来改不加括号只能疯狂哇QAQ 
			{
            	printf("-1\n");return 0;
            }

        }

        for(int i=0;i<n;i++)
        {
        	if(find(i)==find(i+1))
        	{
        		ans++;
        	
			}
		}
        printf("%d\n", ans);
    
    return 0;
}
/*
4 4
1 2 1
2 3 2
1 3 1
2 2 1
*/		
    

 

1233: Mario与Luigi的组合游戏

Time Limit:3000/1000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)
Total Submissions:7   Accepted:3

[Submit][Status][Discuss]

Description

Zeratul首发购买了Nintendo Switch上Mario Party,但由于身边玩Switch的人实在是太少了,这款游戏只能躲在角落吃灰。

Mario与Luigi是三十年前就有的老组合了。他们现在正在玩一种游戏:

桌面上有n(1≤n≤105)n(1≤n≤105)堆石子,每堆石子的个数为a[i](1≤a[i]≤109)a[i](1≤a[i]≤109)。Mario与Luigi交替进行操作,操作可以从以下两种中任选其一:

1.从某堆石子中拿走一个石子。

2.拿走某堆个数为偶数的石子,并且将m(1≤m≤109)m(1≤m≤109)堆石子放回桌面上。放回桌面上的mm堆石子中,每堆的石子个数都为拿走石子数的一半。

Mario会先手进行操作,如果轮到某人操作时,桌面上已经没有石子,那么这个人就输了。

Zeratul意识到,这显然是一种组合游戏,必定有一方存在必胜策略。你的任务是计算当两人都采用最优策略时,谁会取得胜利。

 

Input

输入第一行包括两个整数n,mn,m,含义见Description。

第二行包括nn个整数,代表a[1...n]a[1...n]。

 

Output

如果Mario会取得胜利,输出“Mario”,否则输出“Luigi”。

 

Sample Input

5 1
1 2 3 4 5

Sample Output

Mario

HINT

 

Source

Zeratul

SG函数学习->

题解:没学过SG函数的可以先去看看,学过的话就是一题水题。显然m是偶数的话偶数SG值除了SG[2]是2其他都是1。

如果m是奇数因为只有拿走一个棋子和偶数拆成m堆两种情况, 前几个打下表,后面的偶数可以logn判断,奇数显然是0. 直接暴力求SG值复杂度O(nlogn)刚刚好

代码:

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int sg[2][20];	int n,m;
int SG(int now){
	if(m%2==0){
		if(now<=6){
			return sg[0][now];
		}
		else{
			return (now+1)%2;
		}
	}
	else{
		if(now<=6){
			return sg[1][now];
		}
		else{
			if(now&1){
				return 0;
			}
			else{
				int bb[3];bb[0]=bb[1]=bb[2]=0;
				bb[SG(now/2)]++;
				for(int i=1;i<=2;i++){
					if(!bb[i]) return i;
				}
			}
		}
	}
	
}
int main()
{
	sg[0][1]=1,sg[0][2]=2,sg[0][3]=0,sg[0][4]=1,sg[0][5]=0,sg[0][6]=1;
	sg[1][1]=1,sg[1][2]=0,sg[1][3]=1,sg[1][4]=2,sg[1][5]=0,sg[1][6]=2;
	scanf("%d%d",&n,&m);int ans=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		ans^=SG(a[i]);
	}
	if(ans){
		printf("Mario\n");
	}
	else{
		printf("Luigi\n");
	}
 } 

 

源码来自:https://pan.quark.cn/s/7a757c0c80ca 《在Neovim中运用Lua的详尽教程》在当代文本编辑器领域,Neovim凭借其卓越的性能、可扩展性以及高度可定制的特点,赢得了程序开发者的广泛青睐。 其中,Lua语言的融入更是为Neovim注入了强大的活力。 本指南将深入剖析如何在Neovim中高效地运用Lua进行配置和插件开发,助你充分发挥这一先进功能的潜力。 一、Lua为何成为Neovim的优选方案经典的Vim脚本语言(Vimscript)虽然功能完备,但其语法结构与现代化编程语言相比显得较为复杂。 与此形成对比的是,Lua是一种精简、轻量且性能卓越的脚本语言,具备易于掌握、易于集成的特点。 因此,Neovim选择Lua作为其核心扩展语言,使得配置和插件开发过程变得更加直观和便捷。 二、安装与设置在Neovim中启用Lua支持通常十分简便,因为Lua是Neovim的固有组件。 然而,为了获得最佳体验,我们建议升级至Neovim的最新版本。 可以通过`vim-plug`或`dein.vim`等包管理工具来安装和管理Lua插件。 三、Lua基础在着手编写Neovim的Lua配置之前,需要对Lua语言的基础语法有所掌握。 Lua支持变量、函数、控制流、表(类似于数组和键值对映射)等核心概念。 它的语法设计简洁明了,便于理解和应用。 例如,定义一个变量并赋值:```lualocal myVariable = "Hello, Neovim!"```四、Lua在Neovim中的实际应用1. 配置文件:Neovim的初始化文件`.vimrc`能够完全采用Lua语言编写,只需在文件首部声明`set runtimepath^=~/.config/nvim ini...
基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨在不使用机械式位置传感器的情况下,如何通过算法实现对电机转子位置和速度的精确估算与控制。文中结合STM32 F4高性能微控制器平台,采用如滑模观测器(SMO)、扩展卡尔曼滤波(EKF)或高频注入法等先进观测技术,实现对电机反电动势或磁链的实时估算,进而完成磁场定向控制(FOC)。研究涵盖了控制算法设计、系统建模、仿真验证(可能使用Simulink)以及在嵌入式平台上的代码实现与实验测试,旨在提高电机驱动系统的可靠性、降低成本并增强环境适应性。; 适合人群:具备一定电机控制理论基础和嵌入式开发经验的电气工程、自动化及相关专业的研究生、科研人员及从事电机驱动开发的工程师;熟悉C语言和MATLAB/Simulink工具者更佳。; 使用场景及目标:①为永磁同步电机驱动系统在高端制造、新能源汽车、家用电器等领域提供无位置传感器解决方案的设计参考;②指导开发者在STM32平台上实现高性能FOC控制算法,掌握位置观测器的设计与调试方法;③推动电机控制技术向低成本、高可靠方向发展。; 其他说明:该研究强调理论与实践结合,不仅包含算法仿真,还涉及实际硬件平台的部署与测试,建议读者在学习过程中配合使用STM32开发板和PMSM电机进行实操验证,以深入理解控制策略的动态响应与鲁棒性问题。
先看效果: https://pan.quark.cn/s/21391ce66e01 企业级办公自动化系统,一般被称为OA(Office Automation)系统,是企业数字化进程中的关键构成部分,旨在增强组织内部的工作效能与协同水平。 本资源提供的企业级办公自动化系统包含了详尽的C#源代码,涉及多个技术领域,对于软件开发者而言是一份极具价值的参考资料。 接下来将具体介绍OA系统的核心特性、关键技术以及在实践操作中可能涉及的技术要点。 1. **系统构造** - **三层构造**:大型OA系统普遍采用典型的三层构造,包含表现层、业务逻辑层和数据访问层。 这种构造能够有效分离用户交互界面、业务处理过程和数据存储功能,从而提升系统的可维护性与可扩展性。 2. **C#编程语言** - **C#核心**:作为开发语言,C#具备丰富的类库和语法功能,支持面向对象编程,适用于开发复杂的企业级应用。 - **.NET Framework**:C#在.NET Framework环境中运行,该框架提供了大量的类库与服务,例如ASP.NET用于Web开发,Windows Forms用于桌面应用。 3. **控件应用** - **WinForms**或**WPF**:在客户端,可能会使用WinForms或WPF来设计用户界面,这两者提供了丰富的控件和可视化设计工具。 - **ASP.NET Web Forms/MVC**:对于Web应用,可能会使用ASP.NET的Web Forms或MVC模式来构建交互式页面。 4. **数据库操作** - **SQL Server**:大型OA系统通常采用关系型数据库管理系统,如SQL Server,用于存储和处理大量数据。 - **ORM框架**:如Ent...
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值