您的位置:首页 > 编程语言 > C语言/C++

第六届蓝桥杯决赛 C语言B组 题解 第五题_居民集会

2017-05-19 10:36 357 查看
标题:居民集会

蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距离为di。

每年,蓝桥村都要举行一次集会。今年,由于村里的人口太多,村委会决定要在4个地方举行集会,其中3个位于公路中间,1个位最公路的终点。

已知每户家庭都会向着远离公路起点的方向去参加集会,参加集会的路程开销为家庭内的人数ti与距离的乘积。

给定每户家庭的位置di和人数ti,请为村委会寻找最好的集会举办地:p1, p2, p3, p4 (p1<=p2<=p3<=p4=L),使得村内所有人的路程开销和最小。

【输入格式】

输入的第一行包含两个整数n, L,分别表示蓝桥村的家庭数和公路长度。

接下来n行,每行两个整数di, ti,分别表示第i户家庭距离公路起点的距离和家庭中的人数。

【输出格式】

输出一行,包含一个整数,表示村内所有人路程的开销和。

【样例输入】

6 10

1 3

2 2

4 5

5 20

6 5

8 7

【样例输出】

18

【样例说明】

在距起点2, 5, 8, 10这4个地方集会,6个家庭需要的走的距离分别为1, 0, 1, 0, 2, 0,总的路程开销为1*3+0*2+1*5+0*20+2*5+0*7=18。

【数据规模与约定】

对于10%的评测数据,1<=n<=300。

对于30%的评测数据,1<=n<=2000,1<=L<=10000,0<=di<=L,di<=di+1,0<=ti<=20。

对于100%的评测数据,1<=n<=100000,1<=L<=1000000,0<=di<=L,di<=di+1,0<=ti<=1000000。

资源约定:

峰值内存消耗 < 512M

CPU消耗 < 5000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

其实很简单深度搜索,就是选三个点在人家的村落然后再来算。

#include<iostream>
using namespace std;

int n,m,data[100][3],sum,ans[5];

void cal(){
int i,j,a=1,b,c,d,e,f=0;

for(i=1;i<=n;i++){
if(data[ans[a]][1]>=data[i][1]){
if(a==4)
f=f+(m-data[i][1])*data[i][2];
else
f=f+(data[ans[a]][1]-data[i][1])*data[i][2];
}

else {
a++;

if(a<=3){
if(data[ans[a]][1]>=data[i][1])
f=f+(data[ans[a]][1]-data[i][1])*data[i][2];
}
else    if(a==4)
f=f+(m-data[i][1])*data[i][2];
else if(a>4)
return ;

}
}

if(sum>f){

sum=f;
}

}

void dfs(int step,int start){
int i,j;

if(step==1)
for(i=start;i<=n-2;i++){
ans[step]=i;
dfs(step+1,i+1);
}
else if(step==2)
for(i=start;i<=n-1;i++){
ans[step]=i;
dfs(step+1,i+1);
}
else if(step==3)
for(i=start;i<=n;i++){
ans[step]=i;
dfs(step+1,i+1);
}
else if(step==4){
cal();

}

}

int main(){

int i,j,a,b,c,d,e,f=0;
cin>>n>>m;
ans[4]=m;
sum=100000000;

for(i=1;i<=n;i++)
cin>>data[i][1]>>data[i][2];

dfs(1,1);
cout<<sum<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: