来写一下这周适合自己的题
第一题P3138Load Balancing S,这是一道求最大值中的最小值类的题目,这题直接看数据范围x,y<10^6,1<=n<=1000,如果直接对于x,y双重循环,直接10^12,绝对超时,所以应想到用n的二次方,离散化,把n对(x,y)转化成1~n,比如说(100,200),(50,300)这俩坐标转化为(2,1),(1,2)。这就是离散化。
sort(pos+1,pos+1+n,cmp1);//按照x的坐标从小到大排列
for(int i=1;i<=n;i++)
{
x[pos[i].id]=i;
}
sort(pos+1,pos+1+n,cmp2);//按照y的坐标从小到大排列
for(int i=1;i<=n;i++)
{
y[pos[i].id]=i;
}
第二题P1535Cow Travelling S这题如果直接搜索,不用剪枝,会超时,直接10分,加个剪枝,在T次之内如果无法到达,直接return。
void dfs(int x,int y,int time)
{
if(x==x2&&y==y2&&time==0)
ans++;
if(!time||abs(x-x2)+abs(y-y2)>time)
return;
for(int i=0;i<4;i++)
if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]=='.')
dfs(x+m_x[i],y+m_y[i],time-1);
}
第三题P2912Pasture Walking G这题我认为是路径搜索问题,根据数据大小可知,最多可以支持n^3,两条道路间是双向道路,Floyd算法+剪枝(在第三次循环前判断两地是否连接)。
就写这些吧,这周身体也好了,继续加油。