贪心算法小白の人品测试

原创 2016年06月01日 13:01:21

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=3555&cid=1755

小白の人品测试

Time Limit: 1000MS Memory limit: 65536K

题目描述

现在有n个人,编号从1到n ,每个人有一个 人品值
这是一个赤裸裸的金钱关系的世界
如果小白想要小黑直接帮他一个忙,他需要支付的代价为 abs(小白的人品 - 小黑的人品)。
小白也可以找小金,然后小金去拜托小黑帮他,这样他就要支付双份的代价,具体的,代价为
abs(小白的人品 - 小金的人品)+abs(小金的人品 - 小黑的人品)
小白还可以找多个人帮忙,不妨记为小A,小B,小C...小Z这样他要支付多份代价
abs(小白的人品 - 小A的人品)+abs(小A的人品 - 小B的人品)+...+abs(小Z的人品 - 小黑的人品)
 
现在问题来了,小白最少要支付多少代价才能获得小黑的帮助

输入

多组输入直到文件结束(EOF)
一个数n代表现在有n个人(2<=n<=1000)
接下来n个整数Ai代表第i个人的人品值(0<= Ai <=100)
为了方便起见,我们假设小白的标号为1,小黑的编号为n

输出

小白要支付的代价

示例输入

5 
1 1 1 1 4
3
1 2 3

示例输出

3
2

提示

abs(x) 是绝对值

来源

“师创杯”山东理工大学第八届ACM程序设计竞赛

示例程序

 
这道题那叫一个恨啊,这是校赛的第二题,其实就是简单的贪心,但是我先想到的却是DFS,结果没注意复杂度TLE更是一脸懵逼QAQ,之后一大半时间没跳出深搜的坑,直到最后的十分钟才猛然惊醒,测试都没测试交上去就A了,唉~还是太年轻啊,这题别人都很快就做出来了,RANK1更是2分钟就解出来了,怎么说呢,这次校赛出的题确实不咋地啊,基本没啥太大的难度梯度,就Rank1做了8道,其余基本就是7道了,而且没有涉及集训的数据结构和算法但是我老是往那想,最后解了6题Rank40得了个二等奖。。。权当一次教训吧,不能再止步不前了,现在到暑假这段期间接着数据结构,暑假集训进军C++

先是DFS代码:

  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cstring>  
  4. #include <algorithm>  
  5. using namespace std;  
  6. bool vis[1000+5];  
  7. int n, a[1000+5], m;  
  8. int abs(int x, int y)  
  9. {  
  10.     return x>y?(x-y):(y-x);  
  11. }  
  12. void dfs(int cur, int ans)  
  13. {  
  14.     if(cur==n&&ans<m)  
  15.     {  
  16.         m=ans;  
  17.         return ;  
  18.     }  
  19.     for(int i=1;i<=n;i++)  
  20.     {  
  21.         if(!vis[i])  
  22.         {  
  23.             vis[i]=1;  
  24.             dfs(i,ans+abs(a[i],a[cur]));  
  25.             vis[i]=0;  
  26.         }  
  27.     }  
  28.     return ;  
  29. }  
  30. int main()  
  31. {  
  32.     while(~scanf("%d", &n))  
  33.     {  
  34.         m=99999999;  
  35.         for(int i=1;i<=n;i++)  
  36.             scanf("%d", &a[i]);  
  37.         memset(vis,0,sizeof(vis));  
  38.         vis[1]=1;  
  39.         dfs(1,0);  
  40.         printf("%d\n", m);  
  41.     }  
  42.     return 0;  
交上发现14级的几位学长学姐也是TLE,估计也是陷进了DFS了。。。

然后是贪心,想到贪心估计这题也就出来了,代码很简单:

  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cstring>  
  4. #include <algorithm>  
  5. using namespace std;  
  6. int n, a[1000+5];  
  7. int abs(int x, int y)  
  8. {  
  9.     return x>y?(x-y):(y-x);  
  10. }  
  11. int main()  
  12. {  
  13.     while(~scanf("%d", &n))  
  14.     {  
  15.         for(int i=1;i<=n;i++)  
  16.             scanf("%d", &a[i]);  
  17.         int cur=1, ans=abs(a[n],a[1]);  
  18.         for(int i=2;i<=n;i++)  
  19.         {  
  20.             if(abs(a[cur],a[i])+abs(a[i],a[n])<ans)  
  21.             {  
  22.                 ans=abs(a[cur],a[i])+abs(a[i],a[n]);  
  23.                 cur=i;  
  24.             }  
  25.         }  
  26.         printf("%d\n", ans);  
  27.     }  
  28.     return 0;  
  29. }  

版权声明:本文为博主原创文章,未经博主允许不得转载。

XYNU—ACM暑假集训第三次测试 贪心算法

问题 A: 灯光控制 时间限制: 1 Sec  内存限制: 128 MB 提交: 53  解决: 40 [提交][状态][讨论版][Edit] [TestData] 题目描述 灯光师...

贪心算法实现活动安排问题

  • 2016年01月27日 11:40
  • 6KB
  • 下载

活动选择问题(动态规划和贪心算法)

有一个由n个活动组成的集合S = {a1, ..., an}     1. 这些活动使用同一个资源,而这个资源在某一时刻只供一个活动使用     2. 每个活动都有一个开始和结束时间si/fi;如果被...

贪心算法的实现与应用

  • 2013年12月27日 22:45
  • 104KB
  • 下载

贪心算法 程序存储

  • 2014年06月02日 17:17
  • 4KB
  • 下载

POJ1328 -- 贪心算法和快速排序

一 。贪心策略:将雷达放置在合适的地方,使得包含的岛屿数量最多。 二。具体分析 我们采用从左到右放置雷达。假设左边第一个岛屿是A(Xa,Ya),从左到右的岛屿依次是A B C .... 我们可以计算出...

半个贪心算法

  • 2013年04月25日 20:44
  • 24KB
  • 下载

背包问题 贪心算法实现

  • 2014年06月27日 22:30
  • 2KB
  • 下载

Java描述贪心算法求解单元点最短路径问题

参考自:http://my.oschina.net/luckid/blog/382615?fromerr=jJ44fzFI 图 如图所示 邻接矩阵如图所示: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:贪心算法小白の人品测试
举报原因:
原因补充:

(最多只允许输入30个字)