算法课作业2 OJ for Divide and Conquer

这篇具有很好参考价值的文章主要介绍了算法课作业2 OJ for Divide and Conquer。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://vjudge.net/contest/581947

A - Ultra-QuickSort

题意

每次给n个无序的数,互不重复,问最少需要多少次必要的交换操作使n个数有序。

思路

看一眼想到逆序数,然后验证了逆序数的个数符合样例,但想了一个3 2 1的话实际上只需要交换一次,但题意说的是必要交换次数也不一样是最优的交换次数,那样就太难了。
于是就简化问题求一个序列逆序数的个数,就用归并了上课讲过,可以在归并拆分返回的时候进行求逆序对,求逆序对两种,一种求每个数的右边比它小的数的个数,一种求每个数左边比它大的个数,我用第二种做的,归并返回的时候,两个数组都是有序的可以求右边的数组中每个元素,对于左边一共有几个比他大的,代码能力还行,wa了一次因为数组开的int 归并一次就写对了,我感觉我又行了哈哈哈。

#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn=500005;
long long a[maxn],box[maxn];
long long ans;
void mergesort(int left,int right)
{
	if(left>=right) return;
	int mid=(left+right)/2;
	mergesort(left,mid);
	mergesort(mid+1,right);
	int j=left;
	for(int i=mid+1;i<=right;i++)
	{
		while(a[j]<a[i]&&j<=mid)
		{
			j++;
		}	
		ans=ans+mid-j+1;
	}	
	int i=left;
	j=mid+1;
	int t=1;
	while(i<=mid&&j<=right)
	{
		if(a[i]<=a[j])
			box[t++]=a[i++];
		else
			box[t++]=a[j++];
	}
	while(i<=mid)
		box[t++]=a[i++];
	while(j<=right)
		box[t++]=a[j++];
	t=1;
	for(int i=left;i<=right;i++)
		a[i]=box[t++];
}
int main()
{
	int n;
	while(scanf("%d",&n)&&n!=0)
	{
		memset(a,0,sizeof(a));
		for(int i=1;i<=n;i++)
			scanf("%lld",&a[i]);
		ans=0;
		mergesort(1,n);
//		for(int i=1;i<=n;i++)
//			printf("%d ",a[i]);
//		printf("\n");		
		printf("%lld\n",ans);
	}	
	return 0;
}

B - Hanoi Tower Troubles Again!

题意

给n个柱子,这个人要从第一根柱子到第n个柱子挨个往上面放球,球编号从1开始递增,要求两个相邻球编号和为完全平方数。

思路

简单模拟题

#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;

int box[55];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		memset(box,0,sizeof(box));
		int i=1;
		while(1)
		{
			int flag=0;
			for(int j=1; j<=n; j++)
			{

				if(box[j]==0)
				{
					box[j]=i++;
					flag=1;
					break;
				}
				else
				{
					int k=(int)sqrt(box[j]+i);
					if(k*k==(box[j]+i))
					{
						box[j]=i++;
						flag=1;
						break;
					}
				}
			}
			if(flag==0) 
				break;
		}
		printf("%d\n",i-1);
	}
}

C - Fibonacci Again

思路:模拟题

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

const int MAXN=1000005;
int f[MAXN]; 
int main()
{
	f[0]=7;
	f[1]=11;
	for(int i=2;i<=1000000;i++)	
		f[i]=f[i-1]%3+f[i-2]%3;
	int t;
	while(scanf("%d",&t)!=EOF)
	{

		if(f[t]%3==0)
			printf("yes\n");		
		else
			printf("no\n");
	}
	return 0;
}

E - Fire Net

题意

给n*n(n<=4)的格子,格子上可能有墙,或者为空地,空地可以建设碉堡,碉堡可以上下左右射击,射不穿墙,问最多可以建设多少碉堡?

思路

DFS模拟简单题
一共最多16个格子嘛,我就是从上往下,从左往右,挨个尝试每个位置,然后对于每个位置能不能安装,只需要扫描它的上方和左方是否有碉堡就可以啦,注意一下边界就好。

#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;

int m[10][10];
int n;
int ans;
void dfs(int start,int cnt)
{
	if(start>n*n)
	{
		ans=max(ans,cnt);
//		if(cnt>=4)
//		{
//			for(int i=1; i<=n; i++,printf("\n"))
//				for(int j=1; j<=n; j++)
//					printf("%d ",m[i][j]);
//			printf("\n");
//		}
		return;
	}
	int row=(start-1)/n+1;
	int col=(start-1)%n+1;
	for(int i=start; i<=n*n; i++)
	{
//		取
		if(m[row][col]!=1)
		{
			int flag=1;
			for(int j=col-1; j>=1&&m[row][j]!=1; j--)
				if(m[row][j]==2)
				{
					flag=0;
					break;
				}
			for(int j=row-1; j>=1&&m[j][col]!=1; j--)
				if(m[j][col]==2)
				{
					flag=0;
					break;
				}
			if(flag)
			{
				m[row][col]=2;
				dfs(i+1,cnt+1);
				m[row][col]=0;
			}
		}
//		不取
		dfs(i+1,cnt);
	}
	return;
}
int main()
{
	while(scanf("%d",&n)&&n!=0)
	{
		ans=0;
		getchar();
		for(int i=1; i<=n; i++)
		{
			for(int j=1; j<=n; j++)
			{
				char c;
				scanf("%c",&c);
				if(c=='.') m[i][j]=0;
				else m[i][j]=1;
			}
			getchar();
		}
		for(int i=1; i<=n*n; i++)
		{
			dfs(i,0);
		}
		printf("%d\n",ans);
	}
}
/*
4
.X..
....
XX..
....
*/

F - Gridland

题意

给n*m的房子,四通八达,距离都是1,旅行商问题

思路

看奇数和偶数,偶数可以正好跑回去,奇数需要走个斜边

#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;

int main()
{
	int T;
	scanf("%d",&T);
	for(int i=1;i<=T;i++)
	{
		int m,n;
		scanf("%d%d",&m,&n);
		printf("Scenario #%d:\n",i);
		double t=m*n;
		if((m*n)%2==0)
			printf("%.2lf\n",t);
		else
			printf("%.2lf\n",t-1+sqrt(2));
		printf("\n");
	}
}

G - Maximum Subarray Sum

题意

最大连续子序列和

思路

简单题,注意开long long和可能超int文章来源地址https://www.toymoban.com/news/detail-722770.html

#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=2e5+5;
int a[MAXN];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	long long maxx=0;
	long long ans=a[1];
	for(int i=1;i<=n;i++)
	{
		maxx=maxx+a[i];
		ans=max(maxx,ans);
		if(maxx<0) maxx=0;
	}
	printf("%lld",ans);
}

J - Beat the Spread!

#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>

int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		if((a+b)%2)
		{
			printf("impossible\n");
			continue;
		}
		int maxx=(a+b)/2;
		int minn=a-maxx;
		if(maxx<0||minn<0)
		{
			printf("impossible\n");
			continue;
		}
		printf("%d %d\n",maxx,minn);
	}
}

到了这里,关于算法课作业2 OJ for Divide and Conquer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Atcoder ABC340 C - Divide and Divide

    时间限制:2s 内存限制:1024MB 所有图片源自Atcoder,题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【样例输入1】 【样例输出1】 【样例说明1】 【样例输入2】 【样例输出2】 【样例输入3】 【样例输出3】 老汉使用到的是记忆递归的解题方式 本题是求将 n 分解至 n 个 1

    2024年02月20日
    浏览(35)
  • AtCoder Beginner Contest 340 C - Divide and Divide【打表推公式】

    原题链接:https://atcoder.jp/contests/abc340/tasks/abc340_c Time Limit: 2 sec / Memory Limit: 1024 MB Score: 300 points 问题陈述 黑板上写着一个整数 N。 高桥将重复下面的一系列操作,直到所有不小于2的整数都从黑板上移除: 选择写在黑板上的一个不小于2的整数x。 擦去黑板上出现的一个x。然

    2024年02月20日
    浏览(36)
  • 2023年下学期《C语言》作业0x02-分支 XTU OJ 1068 1069 1070 1071 1072

    没有换行,不然会格式错误 取模和取余的叠加使用,可以实现取数字最后一位的要求  c语言使用布尔变量需要使用stdbool.h头文件,哪怕输入的是整数,我们定义为双精度变量存储数据其实也是可以的 

    2024年02月07日
    浏览(34)
  • 湘大 XTU OJ 1290 Alice and Bob 题解(非常详细):字符串 分类讨论 简单模拟

    1290 Alice and Bob Alice和Bob玩剪刀-石头-布的游戏 ,请你写个程序判断一下比赛的结果。 第一行是一个整数K,表示样例的个数。 以后每行两个单词, rock表示石头,paper表示布,scissors表示剪刀 。 前面一个单词是Alice出的拳,后面一个单词是Bob出的拳。 平局输出\\\"Draw\\\",否则输出

    2024年02月13日
    浏览(37)
  • [Optimization] For matlab and cvx

    let\\\'s consider a simple linear programming problem using MATLAB and the CVX toolbox. In this example, we want to maximize the objective function f(x,y)=3x+2yf(x,y)=3x+2y subject to the constraints: 2x+y≤20 2x+y≤20 4x−5y≥−10 4x−5y≥−10 x,y≥0 x,y≥0 Here\\\'s how you can use MATLAB with CVX to solve this optimization problem:

    2024年01月22日
    浏览(39)
  • 【算法】BF、KMP算法及OJ题

      大家好,好久不见,这里是平凡的人,众所周知,现在是暑假时期,趁现在时间比较充裕,博主将通过这篇博客具体介绍数据结构与算法中的BF、KMP算法, 记录自己的学习过程加上自己的理解,希望能够帮到更多的人了解学习BF、KMP算法。同时,如果存在错误的地方,还请

    2024年02月01日
    浏览(49)
  • 贪心算法OJ刷题(1)

    指所求问题的整体最优解可以通过一系列局部最优的选择来到达。是不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考

    2023年04月25日
    浏览(35)
  • 【算法训练笔记】栈的OJ题

           🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️林 子       🛰️博客专栏:✈️ 小林的算法训练笔记       🛰️社区 :✈️ 进步学堂       🛰️欢迎关注:👍点赞🙌收藏✍️留言 题目链接: 1047. 删除字符串中的所

    2024年02月09日
    浏览(43)
  • 动态规划算法OJ刷题(3)

    问题描述 给出一个字符串s,分割s使得分割出的每一个子串都是回文串。计算将字符串s分割成回文串的最小切割数。例如:给定字符串s=“aab”,返回1,因为回文分割结果[“aa”,“b”]是切割一次生成的。 解题思路 方法1:用一维数组来完成,O(N^3) 注意转移方程必须是让两个

    2024年02月14日
    浏览(38)
  • 链表经典算法OJ题目

    直接在原链表里删除val元素,然后让val前一个结点和后一个节点连接起来。 这时我们就需要3个指针来遍历链表: pcur  —— 判断节点的val值是否于给定删除的val值相等 prev ——保存pcur的前一个节点,为删除节点后,连接pcur之后的节点做准备 del —— 保存pcur之后的一个节点

    2024年04月26日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包