关闭

贪心算法小白の人品测试

312人阅读 评论(0) 收藏 举报
分类:

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. }  

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11357次
    • 积分:637
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    最新评论