• SRM479


    250pt:

    题意:有一排一共44,777,777个人,每个人需要咖啡或者茶,队伍的头部有一台饮料机,有一个空姐负责给所有人送饮料,她一开始在也头部。空姐拿一个水壶,一开始是空的,可以在饮料机的地方加最多7个单位的咖啡或者茶,加一次要47秒。空姐在相邻位置移动需要1秒,空姐给一个人倒茶或者咖啡需要4秒。现在告诉你哪些乘客需要茶(最多50个),问最优策略下,空姐需要多少时间可以给所有乘客倒好饮料并且回到队列头。

    思路:直接枚举

    500pt:

    题意:有n<=477个城市,然后一些城市之间会有航班,每个航班有起飞和到达站、飞行时间,有一个航班开始时间,还有一个周期,从开始时间开始,每隔一个周期有一班飞机起飞。现在有一个人要从1飞到n,保证1到n之间没有直接的航班,于是必须至少要换一次航班。每次换航班都有一个等待时间,所有等待时间中的最小值就是一个保险系数。现在要在t<=1,000,000,000的时间内从1到达n,问可以达到的最大保险系数是多少。
    思路:直接二分答案,那么接下来就是一个spfa判定了。

    code:

      1 #line 7 "TheAirTripDivOne.cpp"
      2 #include <cstdlib>
      3 #include <cctype>
      4 #include <cstring>
      5 #include <cstdio>
      6 #include <cmath>
      7 #include <algorithm>
      8 #include <vector>
      9 #include <string>
     10 #include <iostream>
     11 #include <sstream>
     12 #include <map>
     13 #include <set>
     14 #include <queue>
     15 #include <stack>
     16 #include <fstream>
     17 #include <numeric>
     18 #include <iomanip>
     19 #include <bitset>
     20 #include <list>
     21 #include <stdexcept>
     22 #include <functional>
     23 #include <utility>
     24 #include <ctime>
     25 using namespace std;
     26 
     27 #define PB push_back
     28 #define MP make_pair
     29 
     30 #define REP(i,n) for(i=0;i<(n);++i)
     31 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
     32 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
     33 
     34 typedef vector<int> VI;
     35 typedef vector<string> VS;
     36 typedef vector<double> VD;
     37 typedef long long LL;
     38 typedef pair<int,int> PII;
     39 int A[500], B[500], F[500], P[500], T[500];
     40 vector<int> g[578];
     41 bool vis[500];
     42 long long d[500];
     43 class TheAirTripDivOne
     44 {
     45         public:
     46         string S;
     47         int n, m, limit;
     48         void make_flight(){
     49              m = 0;
     50            //  cout << S << endl;
     51              int cnt = 0, tmp = 0;
     52              for (int i = 0; i < S.size(); ++i){
     53                   if  (S[i] == ','){
     54                       if (cnt == 0) A[m] = tmp;
     55                       if (cnt == 1) B[m] = tmp;
     56                       if (cnt == 2) F[m] = tmp;
     57                       if (cnt == 3) T[m] = tmp;
     58                       cnt++;
     59                       tmp = 0;
     60                   }
     61                   else if (S[i] == ' '){
     62                       P[m++] = tmp;
     63                       tmp = cnt = 0;    
     64                   } else tmp = tmp * 10 + S[i] - 48; 
     65              }
     66              if (tmp > 0) P[m++] = tmp;
     67              for (int i = 0; i <= n; ++i)
     68                  g[i].clear();
     69              for (int i = 0; i < m; ++i)
     70                  g[A[i]].PB(i);     
     71         }
     72         bool SPFA(int waitTime){
     73             for (int i = 1; i <= n; ++i)
     74                 d[i] = (1LL << 40);
     75             queue<int> q;
     76             d[1] = -waitTime;
     77             vis[1] = true;
     78             q.push(1);
     79             long long time, r;
     80             while (!q.empty()){
     81                  int u = q.front(), v;
     82                  for (int i = 0; i < g[u].size(); ++i){
     83                         v = B[g[u][i]]; 
     84                         time = d[u] + waitTime;
     85                         if (time <= F[g[u][i]]) time = F[g[u][i]];
     86                         else {
     87                                  r = (time - F[g[u][i]] - 1) / P[g[u][i]] + 1;
     88                                  time = F[g[u][i]] + P[g[u][i]] * r;
     89                              } 
     90                         if (time + T[g[u][i]] < d[v]){
     91                                d[v] = time + T[g[u][i]];
     92                                if (!vis[v]) q.push(v), vis[v] = true;            
     93                                         
     94                         }
     95                  }
     96                  q.pop();
     97                  vis[u] = false;     
     98             }
     99             return d[n] <= limit;
    100         } 
    101         int solve(){
    102             int l = 1, r = 1000000000, mid;
    103             int ret = -1;
    104             while (l <= r){
    105                  mid = (l + r) >> 1;
    106                  if (SPFA(mid)){
    107                       l = mid + 1;
    108                       ret = mid;              
    109                  } else r = mid - 1;    
    110             }
    111             return ret;  
    112         }
    113         
    114         int find(int N, vector <string> flights, int time)
    115         {
    116                 S = accumulate(flights.begin(), flights.end(), string(""));
    117                 n = N;
    118                 limit = time;
    119                 make_flight();
    120                 return solve();
    121         }
    122  };
    View Code
  • 相关阅读:
    Java 1 (JVM、JRE、JDK之间的关系)
    Java 0 (jdk下载安装及环境配置)
    推荐之链接
    idea 2019激活码
    Mock数据使用的Util
    mybatis慢查询配置
    logback参考配置
    Linux网络实时监控配置
    jmeter插件JMeterPlugins-Standard 压力测试
    ZoneDateTime 转换Date
  • 原文地址:https://www.cnblogs.com/yzcstc/p/3627077.html
Copyright © 2020-2023  润新知