标签:
上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来 之后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设 置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通 道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。
4 5 1 2 3 4 2 4 3 2 3 3 3 2 5 2 4
2 2 4
分析:
这道题我在一开始没能做出
经过分析之后
我认为,可以使用贪心算法,
将行与行,列与列之间交头接耳的人数进行记录,
while(d--){//总计输入d组交头接耳的位置
cin>>x1>>y1>>x2>>y2;
if(x1==x2){//如果两列上下相邻
if(y1<y2)l[y1].s++;
else l[y2].s++;//比较大小计算将人数算在哪一行
}
else {//因为输入保证他们前后相邻或者左右相邻,所以剩下一种左右相邻的情况
if(x1<x2)h[x1].s++;
else h[x2].s++;
}
}
将行与行,列与列之间交头接耳的总数进行从大到小排序
这里可以使用sort排列,
但是因为是从大到小的顺序
所以还需要使用cap
bool cap(node p,node q){
return p.s>q.s;
}
sort(h+1,h+n,cap);
sort(l+1,l+m,cap);
因为是贪心算法,选择对自己最有利的选择
所以,在有限的名额中将的当前交头接耳人数最多的行,列之间隔开
最终可得到最优方案:
for(int i=1;i<=nk;i++)cout<<h[i].id<<" ";
cout<<endl;
for(int i=1;i<=mk;i++)cout<<l[i].id<<" ";
cout<<endl;
}
最后,还有一点需要特别注意:
输出也需要排序,所以我们还要对结果进行从小到大排序
bool cap1(node p,node q){
return p.id<q.id;
}
sort(h+1,h+nk+1,cap1);
sort(l+1,l+mk+1,cap1);
经过11 年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为0 时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径 的平方和。
某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。
0 0 10 0 2 -3 3 10 0 0 0 6 0 5 -4 -2 -2 3 4 0 6 -2 9 1
18 30
分析:
如题,我们可以得知是使用贪心,枚举算法
也就是说,要取对自己最有利的情况
即为两范围半径平方和最小的情况下:
int dis(int a,int b,int c,int d){
return (a-c)*(a-c)+(b-d)*(b-d);
}
既然要求出最小的情况,就需要进行枚举
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
int r1=dis(a,b,x[i],y[i]);
int r2=0;
for(int k=1;k<=n;k++)
if(dis(a,b,x[k],y[k])>r1&&dis(c,d,x[k],y[k])>r2)
r2=dis(c,d,x[k],y[k]);
}
枚举原理为:
要想使两者半径和最小,且覆盖到所有导弹
所以,我们可以得到:
1.甲拦截半径一定等于该点到某个导弹的距离
而乙的拦截半径一定等于该点到剩下的导弹中最远的距离
2.所有甲打不到的导弹都要由乙来打到
既然是贪心算法,所以每次都会比较大小
void work(){
int minv=10000000;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
int r1=dis(a,b,x[i],y[i]);
int r2=0;
for(int k=1;k<=n;k++)
if(dis(a,b,x[k],y[k])>r1&&dis(c,d,x[k],y[k])>r2)
r2=dis(c,d,x[k],y[k]);
if(minv>r1+r2) minv=r1+r2;
}
cout<<minv;
}
最后输出最小和值
标签:
原文地址:http://www.cnblogs.com/qswx/p/5965798.html