[水]Openjudge 大师兄,师傅被妖怪抓走啦

A:大师兄,师傅被妖怪抓走啦

总时间限制: 1000ms

内存限制: 65536kB
描述

孙悟空听到沙僧大喊一句:“大师兄,师傅被妖怪抓走啦!”于是孙悟空直追白骨精而去。孙悟空在一条长度为L的森林小路上飞奔,上面有L+1个整点,依次为0,1,2……L。白骨精会使用一种大范围的攻击法术,产生N个能量球,其中第i个能量球的能量值为f[i],落在小路的整点k[i]上。当孙悟空的位置离能量球i的距离为s时,会受到f[i]-s的伤害,如果f[i]-s计算出的伤害为负值,则判定为0。孙悟空虽然救师心切,但也不能葬身于白骨精的法术之中,因此他想知道应该躲在哪一个整点处,才能让自己受到的总伤害最小。

输入
第1行:2个正整数L,N (1 ≤ L ≤ 2,000,1 ≤ N ≤ 2,000)
第2行:N个整数,第i个数表示编号为i的能量球落点坐标k[i] (0 ≤ k[i] ≤ L)
第3行:N个整数,第i个数表示编号为i的能量球的能量值f[i] (1 ≤ f[i] ≤ 10,000)
输出
第1行:1个整数,表示最小总伤害对应的坐标,如果有多个坐标取得最小值,输出最小的一个坐标。
第2行:1个整数,表示受到的最小总伤害的值
样例输入
4 3 
1 4 2 
10 5 7
样例输出
0
15

一个完全没有算法实现的题,因为需要记录的量比较多,还是比较容易出错,主要还是考察编码实现能力。以前看到这种题目的时候总是有点心虚,而现在一点也不怕了,总算是一个提高吧。

不过在培训过程中发现一个问题:自己总是眼高手低,想要做难一些的题目,但是思维能力和编码能力还没有跟上来。或许因为自己的水平与别人相比有差距吧。先把数据结构的基础打好才是最重要的。

代码实现很简单,一个2重循环,把每一个最大值的位置记录下来就可以了。

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
const int INF=0xffffff;
int k[10010],f[10010];
int m[10010]={0};
int main()
{
 int L,N;
 cin>>L>>N;
 for (int i=0;i<N;i++)
  cin>>k[i];
 for (int i=0;i<N;i++)
  cin>>f[i];
 for (int i=0;i<=L;i++)
  for (int j=0;j<N;j++)
   m[i] += (f[j]-abs(k[j]-i)>0 ? f[j]-abs(k[j]-i): 0 ); //第i个位置的伤害总和,能量值减去二者距离即为造成的伤害 (最小为0) 
 int max=INF;
 int vis;
  for (int i=0;i<=L;i++)
   if (m[i]<max) {max=m[i]; vis=i; }
 cout<<vis<<endl;
 cout<<max<<endl;
 return 0;
}



 

 

你可能感兴趣的:(ACM)