説明[タイトル]
有名な観光都市B市の公共交通機関を利用して旅行に人々を奨励するためには、変更のメトロバスの割引プログラムを開始しました:
1.あなたはこのの生活の中で45分の期間の後に地下鉄で乗るためにチケットを入手することができますがありません複数の運賃バスの運賃で航空券、自由旅行を消費することができます。それはすなわち、地下鉄45分以下の開始時刻との時間差から始まる期間にバスを参照します。
tsubway≤45tbus-tsubway≤45-TBUS
2.メトロチケットは連続何回かバスでチケットの連続使用後に地下鉄を取ることができます蓄積を得ることができます。
あなたはチケットがチケットを使用する使用することができた場合3.バスに乗り、条件を満たすために複数のチケットがある場合は、最優先の消費チケットを取得します。
今、あなたはXiaoxuan最寄の公共交通機関のレコードを取得、あなたは彼が彼のコストを計算することができますか?
[入力]
最初の行は、記録された旅行の代表的な正の整数Nを含んでいます。
次のn行、各ラインは、隣接する二つの数字の間の空間と、三つの整数を含んでいます。図1は、バスを表し、i番目の記録輸送車両のi番目の行の整数を表し、地下鉄0; 2は、i番目の運賃priceipricei記録の整数を表し、Iを表す第3の整数車ティティにより、記録開始時刻(時間0からの分数)。
私たちは車を起動する年代順に提示され、2つの旅行レコードが同じ分に表示されていない旅行の記録を保証します。
[出力]
旅行宣の総コストを表す正の整数を含む唯一のラインであります
[]入力サンプル
6
0 10 3
1 46である。5
0 50 12である
1 3 96
0.5 110
1 135 6
[出力]サンプル
36
[注]
[O]サンプル記述1
地下鉄で最初の3分の最初のレコードは、10元を過ごすために。
第二のレコードは、46分でバスで、あなたはチケットを入手するために地下鉄の最初のレコードを使用することができますので、費用はかかりません。
10のページ5
地下鉄で最初の50分で3番目のレコードは、12元を過ごすために。
地下鉄で3番目のレコードの距離に起因するバスで最初の96分での記事のレコードは、45分以上となっているので、チケットの有効期限が切れ、バスで3元を過ごしました。
地下鉄で最初の110分の記事のレコードは、5元を過ごすために。
記事のレコードは、バスで最初の135分で、5番目のレコードの手の中にのみ、この時以来チケットが有効な取得するために地下鉄に乗るが、このバスの運賃は5番目のレコードよりも高い6元であり、 500万によって地下鉄の運賃は、あなたがバスで6元を過ごしたチケットを、使用することはできません。
これは、36元の合計を過ごしました。
サンプル2の[Enter]
6
0 5 1
0 20 16
0 23れる。7
。1 18 31である
。1 38れている。4
。1 68 7
[2]サンプル出力
32
[O]サンプル記述2
最初の分地下鉄の最初のレコードは5元の費用がかかります。
第二のレコードは、16分地下鉄で20元の費用がかかります。
23分地下鉄で3番目のレコードは、7元を過ごすために。
31分後にバスで記事のレコードを、この時間はわずか地下鉄の運賃は乗って第二のレコードは、現在のバスの運賃よりも高いので、地下鉄での第二のレコードの使用は、チケットを取得します。
記事のレコードは、第38回分で取得する地下鉄の最初のレコードをある地下鉄の切符を得た第一及び第三のレコードが最初にチケットを取得するために使用を使用することができ、この時間は、バスを利用します割引券。
記事は、利用可能な地下鉄の乗車券で3番目のレコードを使用して、バスで68分に記録します。
これは、32元の合計を過ごしました。
スケールデータと[合意]
データ、n≤1,000、ti≤106n≤1,000、ti≤106の30%。
データ、ti≤107、priceiti≤107、priceiの別の15%が同一です。
データ、ti≤109、priceiti≤109、priceiの別の15%が同一です。
データの100%、n≤105、ti≤109,1≤pricei≤1,000n≤105、ti≤109,1≤pricei≤1,000へ。
この難しさはほとんど難しい質問と金の今年のタイトルは、困難な、私は常に、通常のサイクルの方法を使用して起動したいされていないことが、コード(最初のコード)のみ45ポイント、他の55点であるのです残業!
インターネットで別のvertor動的配列を用いて基準法、ACへのそのような文言!
//第一个45分代码!
#include<bits/stdc++.h>
using namespace std;
#define N 100005
long long ans;
struct node{
int s_b;
long long price, t, ts, tprice;
}a[N];
int main(){
int n, j = 1, t = 1;
scanf("%d", &n);
for(int i=1; i<=n; i++){
cin >> a[i].s_b >> a[i].price >> a[i].t;
if(a[i].s_b == 0){
ans += a[i].price;
a[j].ts = a[i].t + 45;
a[j].tprice = a[i].price;
++j;
}else{
int k;
for(k=1; k<j; k++){
if(a[k].ts != -1 ){
if(a[k].ts < a[i].t){
a[k].ts = -1;
}
if(a[k].ts >= a[i].t && a[k].tprice >= a[i].price){
a[k].ts = -1;
break;
}
}
}
if( k == j){
ans += a[i].price;
}
}
}
printf("%lld", ans);
return 0;
}
//第二个AC代码!
#include<bits/stdc++.h>
using namespace std;
long long ans, x, price, t;
struct node{
long long price, t, ts, tprice;
}a;
vector<node>q;
int main(){
int n, j = 1, t = 1;
scanf("%d", &n);
for(int i=1; i<=n; i++){
cin >> x >> price >> t;
if(x == 0){
a.price = price;
a.t = t + 45;
q.push_back(a);
ans += price;
while(!q.empty() && t > q.front().t){//去掉过期的地铁票
q.erase(q.begin(), q.begin()+1);
}
}else{
while(!q.empty() && t > q.front().t){//去掉过期的地铁票
q.erase(q.begin(), q.begin()+1);
}
if(!q.empty()){//确保手里有乘坐过的地铁票
int len = q.size();
bool flag = 0;
for(int i=0; i<len; i++){
if(q[i].price < price)//票价不够 看下一个
continue;
else{
q.erase(q.begin()+i, q.begin()+i+1);
flag = 1;
break;
}
}
if(flag == 0)
ans += price;
}else
ans += price;
}
}
printf("%lld", ans);
return 0;
}
对于上面的45分超时代码,欢迎大家提修改意见。