Diary_3.9

1. Good Key, Bad Key

#define int long long
const int maxn = 1e5+10;
int n, k, a[maxn];
void solve(){
    cin >> n >> k;
    vector<int> dp(n+1, 0);
    int mx = 0;
    for(int i=1; i<=n; i++){
        cin >> a[i];
        mx = max(a[i], mx);
        dp[i] = dp[i-1]+a[i];
    }
    int ans = 0;
    for(int i=0; i<=n; i++){
        int cnt = 2, sum = 0;
        for(int j=i+1; j<=n; j++){
            sum += a[j]/cnt;
            cnt *= 2;
            if(cnt > mx)    break;
        }
        ans = max(ans, dp[i]-k*i+sum);
    }
    cout << ans << endl;
}

2. Three Days Ago

#define int long long
void solve(){
    int max_state = 1<<10;
    vector<int> dp(max_state, 0);
    string s;   cin >> s;
    int len = s.size(), musk = 0;
    dp[0]++;
    for(int i=0; i<len; i++){
        int now = s[i]-'0';
        musk = musk ^ (1<<now);
        dp[musk]++;
    }
    int ans = 0;
    for(int i=0; i<max_state; i++){
        ans += (dp[i]*(dp[i]-1))/2;
    }
    cout << ans << endl;
}

3.

vector<string> sta(4), tar(4);
struct Pos{
    int xl, yl, xr, yr;
};
struct node{
    vector<string> state;
    int step;
    vector<Pos> path;
    node(vector<string> &s, int x){
        state = s;
        step = x;
    }
    node(vector<string> &s, int x, vector<Pos> &cpath){
        state = s;
        step = x;
        path = cpath;
    }
    node(){}
};
map<vector<string>, bool> vis;
pair<int, int> dir[4] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
bool check(int y, int x){
    return y>=0 && x>=0 && y<4 && x<4;
}
vector<Pos> ans;
void bfs(){
    queue<node> q;
    q.push({sta, 0});
    while(!q.empty()){
        auto [now, step, path] = q.front();   q.pop();
        if(now == tar){
            ans = path;
            break;
        }
        if(vis[now])    continue;
        vis[now] = true;
        for(int i=0; i<4; i++){
            for(int k=0; k<4; k++){
                if(now[i][k] != tar[i][k]){
                    for(int j=0; j<4; j++){
                        int ni = i+dir[j].first, nk = k+dir[j].second;
                        if(check(ni, nk)){
                            swap(now[i][k], now[ni][nk]);
                            path.push_back({i, k, ni, nk});
                            q.push({now, step+1, path});
                            swap(now[i][k], now[ni][nk]);
                            path.pop_back();
                        }
                    }
                }
            }
        }
    }
    return;
}
void solve(){
    for(int i=0; i<4; i++)  cin >> sta[i];
    for(int i=0; i<4; i++)  cin >> tar[i];
    bfs();
    int len = ans.size();
    cout << len << endl;
    for(int i=0; i<len; i++){
        cout << ans[i].xl+1 << ans[i].yl+1 << ans[i].xr+1 << ans[i].yr+1 << endl;
    }
}

4.

int n, m, dp[1<<20], inf = 1e9+10;
bool tree[20][20];
void solve(){
    cin >> n >> m;
    for(int i=0; i<m; i++){
        int u, v;   cin >> u >> v;
        tree[u][v] = tree[v][u] = true;
    }
    int mx = 1<<n;
    for(int i=1; i<mx; i++) dp[i] = inf;
    for(int i=1; i<mx; i++){
        vector<int> ver;
        int cnt = 1, x = i;
        while(x){
            if(x&1) ver.push_back(cnt);
            x >>= 1;
            cnt++;
        }
        int len = ver.size();
        bool t = true;
        for(int i=0; i<len; i++){
            for(int k=i+1; k<len; k++){
                if(!tree[ver[i]][ver[k]]){
                    t = false;
                    goto lable;
                }
            }
        }
        lable: ;
        if(t)   dp[i] = 1;
    }
    for(int i=1; i<mx; i++){
        if(dp[i] == 1)  continue;
        for(int mask=i; mask; mask=(mask-1)&i){
            if(dp[i] > dp[mask]+dp[i^mask]){
                dp[i] = dp[mask]+dp[i^mask];
            }
        }
    }
    cout << dp[(1<<n)-1] << endl;
}
posted @ 2025-03-09 10:44  Devpp  阅读(11)  评论(0)    收藏  举报