Afirmación : Probablemente el título es del área de discusión de Niu Ke. La entrada, la salida y el rango de datos del título también son un poco desconocidos. Solo mire las ideas. Estos detalles no importan QAQ. Cualquier error puede ser corregido ~
3.27
Tema uno (codicioso)
Dadas las cadenas de caracteres s1, s2, encuentre el número mínimo de movimientos de s1 a s2 (requiere que solo se pueda seleccionar un carácter de s1 al final de s1)
. Primero, si el número de caracteres correspondiente a las dos cadenas no coincide, entonces la respuesta debe ser -1. De lo contrario, debemos ser capaces de construir una nueva s, haciéndola igual a t. Debido a que el carácter de s puede moverse, el carácter de t no puede moverse. Entonces, la esencia es encontrar la subcadena discontinua más larga de s para que coincida con la subcadena prefijada de t . Como coincide con la subcadena de prefijo de t, entonces podemos igualarlo con avidez. Cada vez que un carácter de s coincide con el carácter actual de t, el carácter de t avanza un bit. La respuesta final es n- el número máximo de dígitos que pueden coincidir.
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
char s[maxn],t[maxn];
int mp1[27],mp2[27];//统计各个字符数
int n;
int main() {
scanf("%d",&n);
scanf("%s%s",s,t);
int j = 0;
for(int i = 0;i < n;i++) {
if(s[i] == t[j]) j++;
mp1[s[i]-'a']++;
mp2[t[i]-'a']++;
}
bool flag = 1;
for(int i = 0;i < 26;i++) {
if(mp1[i] != mp2[i]) {
flag = 0;break;
}
}
if(flag == 0) printf("-1\n");
else printf("%d\n",n-j);
return 0;
}
Tema 2 (Diferencia / Probabilidad)
Consulte
los N intervalos dados (rango 1 ~ 2000), cada intervalo incluye los rangos izquierdo y derecho (1 <= L <= R <= 2000), seleccione un número entero de todos los rangos de intervalos a la vez y encuentre el número de todos los números seleccionados Expectativa del mínimo.
Idea: La probabilidad de un valor único aquí no es fácil de encontrar, pero a su vez podemos encontrar primero
La probabilidad de , y luego la diferencia, se pueden usar para encontrar la probabilidad de un solo valor.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2010;
int n;
int l[maxn],r[maxn];
double p[maxn];
int main() {
int mn = 2000,mx;//确定最小值范围
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",&l[i]),mn = min(mn,l[i]);
for(int i = 0;i < n;i++)
scanf("%d",&r[i]);
double ans = 0;
bool flag = 1;
for(int pos = mn;pos <= 2000;++pos) {
double tmp = 1.0;
for(int i = 0;i < n;++i) {
if(r[i] < pos) {
flag = 0;break;
}
if(l[i]<=pos && pos <= r[i])
tmp *= 1.0*(r[i]-pos+1)/(r[i]-l[i]+1);
}
if(!flag) {
mx = pos-1;break;
}
p[pos] = tmp;//计算出最小值>=pos的概率
}
for(int i = mn;i < mx;++i) {
p[i] -= p[i+1];//差分计算最小值为i的概率
ans += p[i]*i;
}
ans += p[mx]*mx;
printf("%.6f\n",ans);
}
/*
2
1 2
3 3
*/