• E


    E - Elevator
    http://codeforces.com/gym/241680/problem/E
    同余最短路,从0~a-1中每一个i向(i+b)%a连一条权值为b的边,向(i+c)%a连一条权值为c的边,然后跑spfa最短路,此时d[i]表示达到x%a花费的最小的距离,这里放的只有b,c,(解释一下,b,c组合出的实际大小为x,因为x过大,数组存不下,所以表示为x%a
    最后统计答案的时候ans+=1+(h-d[i])/a;当前只有b,c组合出的d[i]算一个答案,然后剩下可以用a来填充

    //用最小的来做同余系比较快

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<queue>
      4 #include<algorithm>
      5 #include<cmath>
      6 #include<ctime>
      7 #include<set>
      8 #include<map>
      9 #include<stack>
     10 #include<cstring>
     11 #define inf 2147483647
     12 #define INF 9187201950435737471
     13 #define ls rt<<1
     14 #define rs rt<<1|1
     15 #define lson ls,nl,mid,l,r
     16 #define rson rs,mid+1,nr,l,r
     17 #define N 100010
     18 #define For(i,a,b) for(long long i=a;i<=b;i++)
     19 #define p(a) putchar(a)
     20 #define g() getchar()
     21 
     22 using namespace std;
     23 long long h;
     24 long long a,b,c,ans;
     25 long long d[1000010];
     26 queue<long long>q;
     27 bool vis[1000010];
     28 
     29 struct node{
     30     long long v;
     31     long long n;
     32     node *next;
     33 }*e[10000010];
     34 
     35 void in(long long &x){
     36     long long y=1;
     37     char c=g();x=0;
     38     while(c<'0'||c>'9'){
     39         if(c=='-')y=-1;
     40         c=g();
     41     }
     42     while(c<='9'&&c>='0'){
     43         x=(x<<1)+(x<<3)+c-'0';c=g();
     44     }
     45     x*=y;
     46 }
     47 void o(long long x){
     48     if(x<0){
     49         p('-');
     50         x=-x;
     51     }
     52     if(x>9)o(x/10);
     53     p(x%10+'0');
     54 }
     55 
     56 void push(long long x,long long y,long long v){
     57     node *p;
     58     p=new node();
     59     p->n=y;
     60     p->v=v;
     61     if(e[x]==0)
     62         e[x]=p;
     63     else{
     64         p->next=e[x]->next;
     65         e[x]->next=p;
     66     }
     67 }
     68 
     69 void spfa(){
     70      For(i,0,a)
     71          d[i]=INF;
     72     q.push(1%a);
     73     d[1%a]=1;
     74     while(!q.empty()){
     75         long long t=q.front();
     76         q.pop();
     77         vis[t]=true;
     78 
     79         for(node *i=e[t];i;i=i->next){
     80             if(d[i->n]>d[t]+i->v){
     81                 d[i->n]=d[t]+i->v;
     82                 if(!vis[i->n]){
     83                     q.push(i->n);
     84                     vis[i->n]=true;
     85                 }
     86             }
     87         }
     88         vis[t]=false;
     89     }
     90 }
     91 
     92 int main(){
     93      freopen("elevator.in","r",stdin);
     94      freopen("elevator.out","w",stdout);
     95     in(h);
     96     in(a);in(b);in(c);
     97     if(a>b) swap(a,b);
     98     if(a>c) swap(a,c);
     99     For(i,0,a-1){
    100         push(i,(i+b)%a,b);
    101         push(i,(i+c)%a,c);
    102     }
    103     spfa();
    104     For(i,0,a-1)
    105         if(h>=d[i])
    106             ans+=1+(h-d[i])/a;
    107     o(ans);
    108     return 0;
    109 }
    View Code
  • 相关阅读:
    xmpp1
    综合
    CSS进阶(一)width & height
    CSS进阶(二)content
    TypeScript 学习笔记-JSDoc
    TypeScript学习笔记-声明合并
    TypeScript 学习笔记-模块
    TypeScript学习笔记-高级类型
    TypeScript学习笔记-类型兼容性
    TypeScript学习笔记-枚举
  • 原文地址:https://www.cnblogs.com/war1111/p/10658691.html
Copyright © 2020-2023  润新知