Давайте рассмотрим $$$2$$$ случая.
- $$$x >= y$$$ можно заметить, что каждую секунду блендер будет смешивать $$$/min(y, c)$$$ фруктов (где $$$c$$$ это количество не смешанных фруктов), следовательно ответ $$$\lceil {\frac{n}{y}} \rceil$$$.
- $$$x < y$$$ можно заметить что каждую секунду блендер будет смешивать $$$/min(x, c)$$$ фруктов, ответ $$$\lceil {\frac{n}{x}} \rceil$$$ аналогично.
Значит ответ это $$$\lceil {\frac{n}{min(x, y)}} \rceil$$$.
#include <iostream>
using namespace std;
int main(){
int t = 1;
cin >> t;
while(t--){
int n, x, y;
cin >> n >> x >> y;
x = min(x, y);
cout << (n + x - 1) / x << endl;
}
}
Можно заметить, что всегда $$$a_{n-1}$$$ будет отрицательным в итоговом ответе. Следовательно, мы можем отнять $$$a_1 + a_2 + \ldots + a_{n-2}$$$ из $$$a_{n-1}$$$, после этого можно отнять $$$a_{n-1}$$$ из $$$a_n$$$. Итого получаем сумму $$$a_1 + a_2 + \ldots + a_{n-2} - a_{n-1} + a_n$$$, больше этого нельзя получить, так как $$$a_{n-1}$$$ всегда будет отрицательным.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
void solve(){
int n;
cin >> n;
ll ans = 0;
vector<int> a(n);
for(int i=0;i<n;i++){
cin >> a[i];
ans += a[i];
}
cout << ans - 2 * a[n - 2] << '\n';
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--){
solve();
}
}
Будем поддерживать изначально пустую строку $$$t$$$, так чтобы $$$t$$$ встречалась в $$$s$$$ как подстрока.
Будем увеличивать строку $$$t$$$ на один символ, пока ее длина меньше $$$n$$$.
Проведем $$$n$$$ итераций, на каждой из них будем спрашивать строки $$$t + 0$$$ и $$$t + 1$$$. Если одна из них встречалась в $$$s$$$ как подстрока, то добавим нужную в конец и перейдем к следующей итерации.
Если же не одна из этих двух строк не встречалась в $$$s$$$, то значит строка $$$t$$$ это суффикс строки $$$s$$$. После этой итерации будем спрашивать строку $$$0 + t$$$, если она встречалась то добавим припишем $$$0$$$ к $$$t$$$, иначе припишем $$$1$$$.
Итого на каждой итерации проводим по 2 запроса, кроме одной итерации с 3 запросами, но после нее мы будем делать только по 1 запросу, поэтому суммарно выйдет не более $$$2 \cdot n$$$ запросов.
#include <iostream>
#include <vector>
#include <string>
#include <array>
using namespace std;
bool ask(string t) {
cout << "? " << t << endl;
int res;
cin >> res;
return res;
}
void result(string s) {
cout << "! " << s << endl;
}
void solve() {
int n;
cin >> n;
string cur;
while (cur.size() < n) {
if (ask(cur + "0")) {
cur += "0";
} else if (ask(cur + "1")) {
cur += "1";
} else {
break;
}
}
while ((int) cur.size() < n) {
if (ask("0" + cur)) {
cur = "0" + cur;
} else{
cur = "1" + cur;
}
}
result(cur);
}
int main() {
int t;
cin >> t;
while (t--)
solve();
}
2013D — Минимизировать разность
сигма
сигма
2013F1 — Игра на дереве (простая версия)
сигма
сигма
2013F2 — Игра на дереве (сложная версия)
сигма
сигма