纪中学习之(第四季)DAY FOUR

本文分享了竞赛编程中的两道题目解法,一道使用暴力枚举和离散化优化,另一道结合最短路、二分查找与匈牙利算法解决。通过实战案例,探讨了算法优化与复杂问题的解决方案。

前言

我们所谓的学姐(学长)离开了我们宿舍·····
好像是说要找他的男盆友去了,唉,怎么会有同性恋·····

今天稍微简单一点,没做题,让我们改题,还讲了新的东西

今天改了昨天的第二题和第三题

第三题

解题思路

这道题用了暴力的方法,把每个幻灯片的点给枚举出来,再判断是否在另一个幻灯片里面,如果在里面,就把颜色相加

程序如下

这个还没有优化,有些点就超时WA了,但是听说要用(离散化)来做
就是把一些幻灯片的没用的地方给去掉,这样就不会炸

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
long long dx[2],dy[2],x1,x2,y1,y2,k,c,ans,a[1001][1001];
bool b[10001];
int main()
{
	freopen("b.in","r",stdin);
	freopen("b.out","w",stdout);
	dx[0]=dy[0]=10000000;
	scanf("%lld",&k);
	for (int i=1;i<=k;i++)
	{
		scanf("%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&c);
		for (int j=x1;j<x2;j++)
		 for (int k=y1;k<y2;k++)        
		  	  a[j][k]+=c;
		 dx[0]=min(dx[0],x1); 
		 dx[1]=max(dx[1],x2);
		 dy[0]=min(dy[0],y1); 
		 dy[1]=max(dy[1],y2);
	}
	for (int i=dx[0];i<=dx[1];i++)
	 for (int j=dy[0];j<=dy[1];j++)
	  {
	  	if (!b[a[i][j]]&&a[i][j]!= 0) {
	  		b[a[i][j]]=1;
	  		ans++;
		  }
	  }
	printf("%lld" , ans);
	fclose(stdin);
	fclose(stdout);
}  

第四题

解题思路

这道题是用这道题是用最短路+二分查找+匈牙利算法 , 然后再求出最短的导弹的时间即可…
因为所有的导弹都是按自己的最短的路径飞去,而最慢的就是至少的时间

程序如下

这个在bool类型的bo定义那里,在下面的memset(bo,false,sizeof(bo));不知为什么就炸了,它显示运行时错误

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
# define maxn 200
using namespace std;
int t[maxn],l[maxn],cx[maxn],cy[maxn],e[maxn][maxn],xy,ans,n,m,k,o,su;
bool bo[maxn*maxn+100];
struct gg
{   
	int x,y,next;
}a[maxn*maxn];
int gg2(int x,int y)
{
	a[xy++].x=x;
	a[xy].y=y;
	a[xy].next=t[x];
	t[x]=xy;
}  
bool gg3(int x)
{   
	int q=0;
	for(int p=t[x];p;p=a[p].next)
	{
		if(!bo[a[p].y])
		{
			q=l[a[p].y];
			l[a[p].y]=x;
			bo[a[p].y]=1;
			if(!q||gg3(q))
			{
				return true;
			}
			l[a[p].y]=q;
		}
	}
	return false;
}   
int gg4(int x)
{   
	memset(t,0,sizeof(cx));
	memset(l,0,sizeof(cy));
	ans=0; su=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(e[cx[i]][cy[j]]<=x) gg2(i,j); 
	for(int i=1;i<=n;i++){
		memset(bo,false,sizeof(bo));
	    if(gg3(i)) su++;
   } 
   return su==m;
}   
int main()
{   
	freopen("c.in","r",stdin);
	freopen("c.out","w",stdout);
	scanf("%d",&k);
	for(int i=1;i<=k;i++)
	{
		for(int j=1;j<=k;j++)
		{
			scanf("%d",&e[i][j]);
		}
	}
	for(int r=1;r<=k;r++)
    {
    	for(int i=1;i<=k;i++)
    	{
    		for(int j=1;j<=k;j++)
    		{
    			e[i][j]=min(e[i][j],e[i][r]+e[r][j]);
			}
		}
	}
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	  scanf("%d",&cx[i]);
	scanf("%d",&m);
	for(int j=1;j<=m;j++)
      scanf("%d",&cy[j]);
	int q=1;
	int u1=1e6;
	while(q<=u1)
	{
		o=(q+u1)/2;
		if (gg4(o)) u1=o-1;
		 else q=o+1;
	}
	printf("%d",q);
	return 0;
	fclose(stdin);
	fclose(stdout);
} 

咳咳,今天就到这了······

明天继续更新·································

距离纪中培训倒计时6天(也就是更新到第10季)

敬请期待······

多多关注

谢谢········

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值