Đề bài: Một siêu nhân chiến đầu với một con quỷ. Cuộc chiến bao gồm nhiều vòng đấu, mỗi vòng kéo dài chính xác n phút. Sau khi một vòng kết thúc, vòng tiếp theo sẽ bắt đầu ngay lập tức. Điều này được lặp lại nhiều lần cho đến khi kết thúc.
Mỗi vòng có một kịch bản (scenario) giống nhau. Nó được mô tả bởi một chuỗi gồm n số: d(1),d(2),...,d(n) (-10^6<=d(i)<=10^6). Phần tử thứ i có nghĩa là hp của con quỹ (hp=hit point) thay đổi bởi giá trị d(i) trong suốt i phút mỗi vòng. Chính thức là, nếu trước i phút của một vòng độ hp của của con quỷ là h, thì sau i phút nó đổi thành h:=h+d(i)
Ban đầu độ ph của con quỹ là H. Điều này có nghĩa là cuộc chiến đấu với con quỷ có H hit point. In ra phút đầu tiên mà con quỷ chết sau đó. Con quỷ chết nếu hp của nó bé hơn hoặc bằng 0. In ra -1 nếu cuộc chiến kéo dài vô hạn.
Đầu vào:
+ Dòng đầu tiên chứa hai số nguyên H và n (1<=H<=10^(12),1<=n<=2.10^5).
+ Dòng thứ hai chứa một dãy số nguyên d(1),d(2),...,d(n) (-10^6<=d(i)<=10^6), với d(i) là giá trị thay đổi hp của con quỷ trong i phút của 1 vòng đấu.
Đầu ra:
In -1 nếu siêu nhân không thể giết con quỷ và cuộc chiến sẽ kéo dài vô tận. Ngược lại, in ra giá trị k thỏa mãn k là phút đầu tiên mà con quỹ chết.
Ví dụ:
Đầu vào: 1000 6
-100 -200 -300 125 77 -4
Đầu ra: 9.
Lời giải:
#include<bits/stdc++.h> using namespace std; int main(){ long long H; int n; cin>>H>>n; vector<long long> a(n); long long sum=0; long long gap=0; long long h=H; for(int i=0;i<n;i++){ cin>>a[i]; sum-=a[i]; h+=a[i]; if(h<=0){ cout<<i+1<<endl; return 0; } gap=max(gap,sum); } if(sum<=0){ cout<<-1<<endl; return 0; } long long whole=(H-gap)/sum; H-=whole*sum; long long result=whole*n; for(int i=0;;i++){ H+=a[i%n]; result++; if(H<=0){ cout<<result<<endl; break; } } }
Không có nhận xét nào:
Đăng nhận xét