La 13.ª competencia de la Copa Blue Bridge Competencia de software Competencia provincial C/C++ Grupo universitario B

Resumen del Grupo B de C/C++ Universidad del XIII Concurso de Software Copa Puente Azul Concurso Provincial

Consejo: El código es el código que envié durante la competencia, ¡eso no significa que sea la solución correcta! ! !

Pregunta A: Nueve a decimal

Violencia

1478

Pregunta B: Fecha de Shun Zi

¡012 no se cuenta como QAQ! ! ! ! ! ! !

De todos modos, también es violencia. Según la respuesta del compañero de equipo, debería ser

4

Pregunta de prueba C: Estadísticas de la pregunta de pincel

Suponiendo que lleva x semanas + y días, podemos averiguar rápidamente cuántas semanas se necesitan y luego restar lentamente para obtener unos cuantos días más.

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 1e5+9;
int main(){
    
    
    ll a,b,n;
    scanf("%lld %lld %lld",&a,&b,&n);
    ll num = n/(5*a+2*b);
    n = n - num*(5*a+2*b);
    num = num*7;
    for(int i = 1;i <= 7;i++){
    
    
        if(n <= 0) break;
        if(i <= 5){
    
    
            n -= a;
            num++;
        }else{
    
    
            n -= b;
            num++;
        }
    }
    printf("%lld",num);
    return 0;
}

Pregunta de prueba D: poda de arbustos

¿Cómo crece más alto el i-ésimo arbusto? Es decir, Alicia recorta i del arbusto actual hacia la izquierda y recorta i hacia la derecha para ver cuál es más alto.

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 1e5+9;
int n;
int a[N];
int maxx[N];
int main(){
    
    
    scanf("%d",&n);
    for(int i = 1;i <= n;i++){
    
    
        maxx[i] = max(2*(i-1),2*(n-i));
    }
    for(int i = 1;i <= n;i++){
    
    
        printf("%d\n",maxx[i]);
    }
    return 0;
}

Pregunta de prueba E: Resta en base X

Debido a que a es mayor que b, si desea que ab sea lo más pequeño posible, debe hacer que la base de cada bit sea lo más pequeña posible.

pa[i] representa el tamaño del i+1th dígito 1 convertido a decimal

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 1e6+9;
const ll mod = 1e9+7;
ll pow_mod(ll a,ll b){
    
    
    ll ans = 1;
    ll base = a;
    while(b){
    
    
        if(b&1) ans = (ans * base) % mod;
        base = (base * base) % mod;
        b >>= 1;
    }
    return ans;
}
ll n;
ll a[N];
ll b[N];
ll na,nb;
ll pa[N];
int main(){
    
    
    scanf("%lld",&n);
    scanf("%lld",&na);
    for(ll i = 1;i <= na;i++){
    
    
        scanf("%lld",&a[i]);
    }
    reverse(a+1,a+1+na);
    scanf("%lld",&nb);
    for(ll i = 1;i <= nb;i++){
    
    
        scanf("%lld",&b[i]);
    }
    reverse(b+1,b+1+nb);
    ll p = max(na,nb);
    ll ans = 0;
    pa[0] = 1;
    for(ll i = 1;i <= p;i++){
    
    
        ll maxx = max(a[i],b[i]);
        ll x = max(2ll,maxx + 1);
        pa[i] = (pa[i-1]*x)%mod;
        ans = (ans + a[i]*pa[i-1] - b[i]*pa[i-1] + mod) % mod;
    }
    printf("%lld",ans);
    return 0;
}

Pregunta F: Submatriz estadística

Calculé mal la complejidad durante el juego y la calculé con prefijos bidimensionales y violencia. 70 puntos

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 5e2+9;
ll a[N][N];
ll pre[N][N];
ll work(int x1,int y1,int x2,int y2){
    
    
    return pre[x2][y2] - pre[x1-1][y2] - pre[x2][y1-1] + pre[x1-1][y1-1]; 
}
int main(){
    
    
    ll ans = 0;
    ll n,m,k;
    scanf("%lld %lld %lld",&n,&m,&k);
    for(ll i = 1;i <= n;i++){
    
    
        for(ll j = 1;j <= m;j++){
    
    
            scanf("%lld",&a[i][j]);
            pre[i][j] = pre[i-1][j] + pre[i][j-1] - pre[i-1][j-1] + a[i][j];
        }
    }
    for(int i = 1;i <= n;i++){
    
    
        for(int j = 1;j <= m;j++){
    
    
            for(int p = i;p <= n;p++){
    
    
                for(int l = j;l <= m;l++){
    
    
                    ll x = work(i,j,p,l);
                    if(x <= k) ans++;
                }
            }
        }
    }
    printf("%lld",ans);
    return 0;
}

Pregunta de prueba G: dibujo de bloques

¡No! ! ! ! ! ! !

Pregunta H: Buscaminas

Construya un gráfico dirigido de acuerdo con la relación entre Lei y Lei. Tenga en cuenta que dado que el máximo r es 10, solo necesita encontrar 20 * 20 puntos en el plano como máximo y usar el mapa para guardar el gráfico. Siento que yo puede pasar sin contar la complejidad durante la competencia Ahora, después de un cálculo, 50000 * 20 * 20 * log (50000) es un poco límite, espero que la máquina de evaluación sea lo suficientemente rápida.

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 1e6+9;
struct node{
    
    
    ll x,y,r;
}e[N];
vector<int> g[N];
map<pair<ll,ll> ,int> mp;
ll dis(ll x1,ll y1,ll x2,ll y2){
    
    
    return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
}
int vis[N];
void dfs(int now){
    
    
    if(vis[now]) return ;
    vis[now] = 1;
    for(int i = 0;i < g[now].size();i++){
    
    
        int to = g[now][i];
        if(!vis[to]) dfs(to);
    }
}
int main(){
    
    
    ll n,m,r;
    scanf("%lld %lld %lld",&n,&m,&r);
    for(ll i = 1;i <= n;i++){
    
    
        scanf("%lld %lld %lld",&e[i].x,&e[i].y,&e[i].r);
        mp[make_pair(e[i].x,e[i].y)] = i;
    }
    for(int k = 1;k <= n;k++){
    
    
        for(int i = -e[k].r;i <= e[k].r;i++){
    
    
            for(int j = -e[k].r;j <= e[k].r;j++){
    
    
                ll xx = e[k].x+i,yy = e[k].y+j;
                if(dis(e[k].x,e[k].y,xx,yy) <= e[k].r*e[k].r){
    
    
                    if(mp[make_pair(xx,yy)]){
    
    
                        g[k].push_back(mp[make_pair(xx,yy)]);
                    }
                }
            }
        }
    }
    for(ll k = 1;k <= m;k++){
    
    
        for(int i = -e[k].r;i <= e[k].r;i++){
    
    
            for(int j = -e[k].r;j <= e[k].r;j++){
    
    
                ll xx = e[k].x+i,yy = e[k].y+j;
                if(dis(e[k].x,e[k].y,xx,yy) <= e[k].r*e[k].r){
    
    
                    if(mp[make_pair(xx,yy)]){
    
    
                        int now = mp[make_pair(xx,yy)];
                        if(!vis[now])
                            dfs(now);
                    }
                }
            }
        }
    }
    ll ans = 0;
    for(int i = 1;i <= n;i++){
    
    
        if(vis[i]) ans++;
    }
    printf("%lld",ans);
    return 0;
}

Pregunta de prueba I: Edición mejorada de Li Bai Dajiu

Para dp tridimensional, defina d[i] [j] [k] para indicar cuántas situaciones hay en los primeros i lugares, después de ir a j tiendas, y quedan k cubos de vino.

Debido a que las flores deben encontrarse al final, d[n+m] [n] [0] solo debe transferirse desde d[n+m-1] [n] [1], por lo que se genera d[n+m -1 ][n][1]

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 2e2+9;
const ll mod = 1000000007;
ll d[N][N][N];
ll n,m;
int main(){
    
    
    d[0][0][2] = 1;
    scanf("%lld %lld",&n,&m);
    ll ans = 0;
    for(int i = 1;i <= n+m;i++){
    
    
        for(int j = 0;j <= n;j++){
    
    
            for(int k = 0;k <= m;k++){
    
    
                if(i != n+m){
    
    
                    if(d[i-1][j][k]){
    
    
                        if(k > 0){
    
    
                            d[i][j][k-1] = (d[i][j][k-1] + d[i-1][j][k])%mod;
                        }
                        if(k*2 <= m){
    
    
                            d[i][j+1][k*2] = (d[i][j+1][k*2] + d[i-1][j][k])%mod;
                        }
                    }    
                }
                
            }
        }
    }
    printf("%lld",d[n+m-1][n][1]);
    return 0;
}

Pregunta de prueba J: cortar bambú

No tengo tiempo para leer QAQ después de escribir

Supongo que te gusta

Origin blog.csdn.net/m0_51687577/article/details/124065402
Recomendado
Clasificación