Day2

发布时间 2023-09-30 21:37:33作者: Qinzh

Day 2

T1

赛时想的爆了,只能去拿40pts暴力

正解是统计质因子个数,然后二分答案判断每个质因子能否满足

但是可以只判2的个数,或者为了确保其不背卡常使用数十个质数即可。

#include <bits/stdc++.h>
#define ll long long
#define gt getchar
#define pt putchar
using namespace std;
inline ll read(){
    ll x=0,f=1;char ch=gt();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=gt();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=gt();}
    return x*f;}
inline void print(ll x){if(x<0)pt('-'),x=-x;if(x>9)print(x/10);pt(x%10+48);}
void file(){freopen("a.in", "r", stdin);freopen("a.out", "w", stdout);}
int n, m;
int a[200005];
int t, res;
int get(int x)
{
    int ans = 0;
    while(x)ans += x / 2, x /= 2;
    return ans;
}
int main()
{
    file();
    n = read(), m = read();
    for(int i = 1; i <= m; ++ i)a[i] = read();
    sort(a + 1, a + m + 1);
    t = get(n);
    for(int i = 1; i <= m; ++ i)
    {
        if((res += get(a[i])) > t)
        {
            cout << i - 1;
            return 0;
        }
    }
    cout << m;
    return 0;
}

T2

赛时的dp写完了之后第二个大样例没过去,因为少判了多段不交合并的情况

改一改就行了

#include <bits/stdc++.h>
#define ll long long
#define gt getchar
#define pt putchar
using namespace std;
inline ll read(){
    ll x=0,f=1;char ch=gt();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=gt();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=gt();}
    return x*f;}
inline void print(ll x){if(x<0)pt('-'),x=-x;if(x>9)print(x/10);pt(x%10+48);}
void file(){freopen("b.in", "r", stdin);freopen("b.out", "w", stdout);}
int n, k;
int a[505], val[505];
int f[505][505];
int main()
{
    //file();
    n = read(), k = read();
    for(int i = 1; i <= n; ++ i)a[i] = read(), val[i] = val[i - 1] ^ a[i];
    for(int l = n - 1; l; -- l)for(int r = l + 1; r <= n; ++ r){
        f[l][r] = 1 << 30;
        for(int g = r; g > l; g -= k - 1)f[l][r] = min(f[l][r], f[l][g - 1] + f[g][r]);
        if((r - l) % (k - 1) == 0)f[l][r] += val[r] ^ val[l - 1];
    }
    cout << f[1][n];
    return 0;
}

T3