1. 程式人生 > >Codeforces 864 C Bus 思維

Codeforces 864 C Bus 思維

iter cout span tor name con 開始 加油 構造

  題目鏈接: http://codeforces.com/problemset/problem/864/C

  題目描述: 輸入a, b, f, k , 一段長度為a的路來回走, 中間f的地方有一個加油站, 油罐的容量為b, 問想要走b次這條路至少需要加多少次油  

  解題思路: 由於K <= 1e4, 所以將每次需要走路的連續序列構造出來再去遍歷一遍這個序列看啥時候需要加油就可以了

  代碼:

技術分享
#include <iostream>
#include <cstdio>
#include <map>
#include <iterator>
#include 
<string> using namespace std; const int maxn = 1e4+100; int dis[maxn]; int main() { int a, b, f, k; cin >> a >> b >> f >> k; int temp1 = f; int temp2 = a-f; temp1 *= 2, temp2 *= 2; dis[1] = f; int flag = 0; if( k & 1 ) flag = 1; if
( flag == 1 ) { dis[k+1] = a-f; int temp = 1; for( int i = 2; i <= k; i++ ) { if( temp==1 ) { dis[i] = temp2; } else { dis[i] = temp1; } temp = -temp; } } else { dis[k
+1] = f; int temp = 1; for( int i = 2; i <= k; i++ ) { if( temp==1 ) { dis[i] = temp2; } else { dis[i] = temp1; } temp = -temp; } } // for( int i = 1; i <= k+1; i++ ) { // cout << dis[i] << " "; // } // cout << endl; int ans = 0; flag = 0; int temp = 0; for( int i = 1; i <= k+1; i++ ) { if( dis[i] > b ) { flag = 1; break; } if( temp + dis[i] <= b ) { temp += dis[i]; } else { temp = dis[i]; ans ++; } } if( flag ) { cout << "-1" << endl; } else { cout << ans << endl; } return 0; }
View Code

  思考: 自己首先一開始想當然的理解了題意, 造成的後果就是樣例怎麽也推不出來, 還以為是題錯了就鹹魚了一個點兒........後來自己又重新把題畫了一遍才發現是自己傻逼, 然後才A掉,媽的智障

Codeforces 864 C Bus 思維