月賽\(\text{Div2T1}\),窩唯一一道\(\text{AC}\)的題(我太菜啦!)
\(\text{solution:}\)
根據題面,顯然三個操作對應三種情況,我們發現每次這三種操作均不涉及前面的數,所以考慮邊讀邊做(暫時不用考慮操作三,它是此題中唯一一個難點,待會再說)
該資料范圍在\(\text{int}\)范圍內,使用變數\(\text{money}\)記錄當前的壓歲錢的多少,\(\text{ans}\)記錄錢不夠花的事件數,至此,我們已經可以完美解決前兩個操作,核心代碼如下,
for(int i=1;i<=m;i++){
money+=f[i];
cin>>t;
if(t==1){
cin>>a;
money+=a;
}
else if(t==2){
cin>>a;
if(money<a)ans++;
else money-=a;
}
}
接下來單獨考慮操作三,一種顯而易見的思路:用一個陣列,每當進行操作三時,該陣列下標為 \(b\) 的地方值加上 \(a\) ,注意!是加上 \(a\) 而不是賦值為 \(a\) ,因為注意到資料有可能出現多個 \(a\) 封印在同一事件的情況,同時,在每次回圈時最前面讓\(\text{ans}\)加上此陣列下標為 \(i\) 的值,當沒有壓歲錢封印在事件 \(i\) 時加上的是0,反之,加上的則是那個陣列下標為 \(i\) ,即,在 \(i\) 事件解封的壓歲錢數,
至此,思路整理完畢,完整(\(\text{AC}\))代碼:
#include <iostream>
#include <cstdio>
using namespace std;
unsigned long long m,t,a,b,money,ans,f[10000001];
int main(){
cin>>m;
for(int i=1;i<=m;i++){
money+=f[i];
cin>>t;
if(t==1){
cin>>a;
money+=a;
}
else if(t==2){
cin>>a;
if(money<a)ans++;
else money-=a;
}
else if(t==3){
cin>>a>>b;
money-=a;
f[b]+=a; //有可能多個壓歲錢封印在同一時刻
}
}
cout<<ans<<endl;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/63269.html
標籤:C++
