1. 程式人生 > >9.18考試總結

9.18考試總結

現在 自然 數學 har code 方程 沒有 合並 一點

9.18考試總結

現在發好像有點晚了不過還是要發一下

漂亮字串

其實是一道簡單的題,當時沒有仔細想每一種情況就沒有做出來

實際上一種種情況排除就出不多了o(1)算法值得擁有

這種題就沒有必要放代碼了

Set

這個題目最開始還是比較暴力,因為涉及到質因數的問題,也就是說一個數可能有多個質數組成,這些質數就可能將其他數字所在的集合串在一起。

當時還沒有想到在求出質數的時候就順便合並的想到沒有實現方法這裏就要用到並查集來幫助合並,可以從一定程度上減小合並過程中的時間復雜度

弄清楚這一點以後基本就敲定是水題了

#include<bits/stdc++.h>
#define open(s) freopen(s".in", "r", stdin); freopen(s".out", "w", stdout);
#define IL inline
#define ll long long
#define ull unsigned long long
#define max(a, b) a > b ? a : b;
#define min(a, b) a < b ? a : b;
using namespace std;

int a, b, p, n;
bool pd[100010];
int c[20000], lenc;
int f[100010];

IL int read();
IL void primes();
IL int find(int);
IL void merge(int, int);

int main()
{
//  open("set");
    a = read(); b = read(); p = read();
    n = b - a + 1;
    for (int i=1; i<=b; ++i)
        f[i] = i;
    primes();
    for (int i=1; i<=lenc; ++i)
    {
        int j=0;
        while (j*c[i] < a) j++;
        while (c[i]*(j+1) <= b)
        {
            merge(c[i]*j, c[i]*(j+1));
            j++;
        }
    }
    int ans = 0;
    for (int i=a; i<=b; ++i)
        if (f[i] == i)
            ans++;
    cout << ans;
    cout << endl;
    return 0;
}

int find(int x)
{
    return f[x] == x ? x : find(f[x]);
}

void merge(int x, int y)
{
    int r = find(x), l = find(y);
    if (r != l)
        f[l] = r;
}

void primes()
{
    pd[1] = pd[0] = 1;
    for (int i=2; i<=b; ++i)
    {
        if (pd[i]) continue;
        if (i >= p) c[++lenc] = i;
        for (int j=i; j<=b/i; ++j)
            pd[j*i] = 1;
    }
}

int read()
{
    int i=1, j=0;
    char x = getchar();
    while (x < '0' || '9' < x)
    {
        if (x == '-') i = -1;
        x = getchar();
    }
    while ('0' <= x && x <= '9')
    {
        j = j * 10 + x - '0';
        x = getchar();
    }
    return i*j;
}

Prison

這個是一個區間DP跟石子合並差不多沒做只要將初始的情況預處理一下其實也並不能

考試的時候主要沒有想到要將分割好的結果以前綴和的方式存起來,直接將分割後的結果逐個合並就可以達到題目要求,所以考試的時候就靠暴力拿分可惜沒有拿到。

for (int k=2; k<=q; ++k)
        for (int i=1; i<=q-k+1; ++i)
        {
            int j = i + k - 1;
            for (int t=i; t<j; ++t)
                if(!f[i][j]||f[i][j]>f[i][t]+f[t+1][j]+b[j]-b[i-1]+j-i-1)
                    f[i][j] = f[i][t]+f[t+1][j]+b[j]-b[i-1]+j-i-1;
        }

因為當時沒有想到這種解法所以轉移方程自然也就沒有想出來,在提供了這種方法以後自然還是可以想出來的

Tree

神仙題,還沒有到我能夠解出的地步。

總得來說面對數學題還是有很大的不足,需要強化這一方面,手推公式,手算規律都比較重要。對新學的知識在運用上有很大問題,還需要題目的練習才能熟練運用。要加強對於算模板的理解

9.18考試總結