前言
我们所谓的学姐(学长)离开了我们宿舍·····
好像是说要找他的男盆友去了,唉,怎么会有同性恋·····
今天稍微简单一点,没做题,让我们改题,还讲了新的东西
今天改了昨天的第二题和第三题
第三题
解题思路
这道题用了暴力的方法,把每个幻灯片的点给枚举出来,再判断是否在另一个幻灯片里面,如果在里面,就把颜色相加
程序如下
这个还没有优化,有些点就超时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);
}
本文分享了竞赛编程中的两道题目解法,一道使用暴力枚举和离散化优化,另一道结合最短路、二分查找与匈牙利算法解决。通过实战案例,探讨了算法优化与复杂问题的解决方案。
945

被折叠的 条评论
为什么被折叠?



