A. Estadísticas de nivel
Asunto
t representa el número de grupos de prueba, n representa el número de grupos de datos del juego y juzga si cada dato de prueba es razonable.
Ideas
- Debe satisfacer p [i], c [i] no son decrecientes.
- En cada momento, p [i]> = c [i].
- Debe haber un cambio en p [i] que debe ser mayor o igual que c [i]
Código
//Powered by CK 2020:04:11
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int p[N], c[N], n;
void fun() {
int flag = 0;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> p[i] >> c[i];
if(c[i] > p[i]) flag = 1;
}
if(flag) {
cout << "NO" << endl;
return ;
}
for(int i = 1; i < n; i++) {
if(p[i] < p[i - 1] || c[i] < c[i - 1] || p[i] - p[i - 1] < c[i] - c[i - 1]) {
cout << "NO" << endl;
return ;
}
}
cout << "YES" << endl;
return ;
}
int main() {
// freopen("in.txt", "r", stdin);
int t;
cin >> t;
while(t--) fun();
return 0;
}
B. clase media
Asunto
Puede tomar cualquier número y dividirlo en partes iguales para obtener el número máximo que satisfaga el valor mayor o igual que \ (x \) .
Ideas
Al leer, registre el número de números mayores o iguales a \ (x \) y la suma de mayores que \ (x \) , y registre el número de diferencias menores que 0. Ordene estos números de mayor a menor, y luego enumérelos uno por uno, reste continuamente la suma de los registros anteriores, la suma es mayor o igual a 0, ans ++, cuando la suma es menor que 0, rompa directamente la respuesta de salida
Código
//Powered by CK 2020:04:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll down[N], n1, n, x, ans;
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
ll t, temp;
cin >> t;
while(t--) {
n1 = ans= 0;
cin >> n >> x;
ll sum = 0;
for(ll i = 0; i < n; i++) {
cin >> temp;
temp -= x;
if(temp >= 0) {
ans++;
sum += temp;
}
else down[n1++] = -temp;
}
sort(down, down + n1);
for(ll i = 0; i < n1; i++) {
sum -= down[i];
if(sum >= 0) ans++;
else break;
}
cout << ans << endl;
}
return 0;
}
C. Círculo de monstruos
Ideas
Primero obtenga el valor de a [i] -b [(i + n) -1% n] para una secuencia completa, luego encuentre el valor mínimo como respuesta enumerando el punto de partida
Código
//Powered by CK 2020:04:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e6 + 10;
ll a[N], b[N], cost[N];
int n;
int main() {
// freopen("in.txt", "r", stdin);
int t;
scanf("%d", &t);
while(t--) {
ll sum = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%lld %lld", &a[i], &b[i]);
if(i) cost[i] = max((ll)0, a[i] - b[i - 1]), sum += cost[i];
}
cost[0] = max((ll)0, a[0] - b[n - 1]);
sum += cost[0];
ll ans = sum - cost[0] + a[0];
for(int i = 0; i < n; i++)
ans = min(ans, sum - cost[i] + a[i]);
printf("%lld\n", ans);
}
return 0;
}
D. Ciclo mínimo de Euler
Ideas
** Encuentre la posición de l ~ r en el orden lexicográfico más pequeño de un recorrido gráfico completo. Podemos encontrar que el orden lexicográfico mínimo es obviamente el siguiente
1 2 1 3 1 4 1 5 ………… 1 (n - 1) 1 n
2 3 2 4 2 5 ………… 2 (n - 1) 2 n
……………………………………………………………………
…………………………………………………………
………………………………………………
……………………………………
…………………………
(n - 1) n
1**
** Hay un total de \ (n (n-1) + 1 \) números, la última línea es especial, solo hay uno **
Por lo tanto, solo necesitamos enumerar estos números con un bucle, el último número se juzga especialmente.
Código
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, l, r;
int main() {
// freopen("in.txt", "r", stdin);
int t;
cin >> t;
while(t--) {
scanf("%lld %lld %lld", &n, &l, &r);
ll sum = 1;
for(ll i = 1; i <= n; i++) {
// cout << i << endl;
if(sum + (n - i) * 2 <= l) {
sum += (n - i) * 2;
continue;
}
for(ll j = i + 1; j <= n; j++) {
if(sum >= l && sum <= r)
printf("%lld ", i);
sum++;
if(sum >= l && sum <= r)
printf("%lld ", j);
sum++;
if(sum > r) break;
}
if(sum > r) break;
}
if(sum <= r) printf("1 ");
printf("\n");
}
return 0;
}