ACM-10月26驲周四周中训练心得

来源:互联网 发布:linux vi移到行尾 编辑:程序博客网 时间:2024/06/05 14:32

    昨天做了一次训练赛,是一个人单打果然感觉思路上会少了些什么,没有和他们交流,自己一个人的思路还是太单一,其他的不多说,对昨天的比赛进行一下复盘,先做的是第一道题,题目的大致意思是小熊维尼要去兔子老鹰屹耳家做客吃东西,维尼非常贪吃要吃n顿,一开始在兔子家吃,然后其他朋友家里拜访吃东西,兔子和老鹰家之间的距离是a老鹰和屹耳家之间的距离是b,屹耳和兔子家之间的距离是c,维尼又比较懒,求维尼需要的最短路程,每次到其他朋友家里原来朋友家里立马就会刷新食物(不科学也没有办法),看到这道题我一开始想到的可能是一个最短路径的题目,也许可以用弗洛伊德这种简单粗暴地算法,后来发现可以有更简单的算法,如果n=1,直接输出0就可以了,如果n大于0,可以先找到三个朋友家之间最短的距离,之后只要一直不断的往返就是最短的距离了,为了达到最短的两个朋友家之间,最多要走一段不是最短的距离。用简单的运算就能解决,主要是一个过程。

#include<iostream>#include<cmath>using namespace std;int n,a,b,c;int main(){    cin>>n>>a>>b>>c;    if(n==1)    {        cout<<0;return 0;    }    int len=min(a,min(b,c)),ans;    if(len==a||len==b)ans=len*(n-1);    else ans=min(a,b)+(n-2)*len;    cout<<ans<<endl;    return 0;}
    然后做的第三题这道题大致的意思是先输入一个x然后找一个数n,这个数n再加上这个数的每一位的和就是x然后去寻找这个n,一开始我想的是二分查找法,然后试了一下对于数据还是太大,最后发现由于数字的位数最多100位,每一位的算也能做。

for(int i=100;i>=0;i--){          if(n-i<=0) continue;          LL p = n-i,sum = n-i;          while(p)        {              sum+=p%10;              p/=10;          }          if(sum==n) a[k++]=n-i;      }      printf("%lld\n",k);      for(int i=0;i<k;i++) printf("%lld\n",a[i]);      return 0;  






原创粉丝点击