牛客網練習賽 41

2021-09-11 19:52:22 字數 2558 閱讀 6933

a:

中文題意,直接說思路

可以知道在n%m == 0 的時候可以全部翻轉完,但當第一次翻轉完之後b使壞一次就永遠也翻不到,所以只有當n==m的時候是yes其他都是no

**:

#include using namespace std;

int main()

}

b:

思路:

簡單的計數dp,可以設 dp[i][j]表示的是你在第i輪湊到j數字的時候的方案數是多少,那麼這個狀態可以是從dp[i-1][j-a[i]] 和 dp[i-1][-j]分別加上a[i]和乘-1轉移過來,所以加個和,由於666的性質,我們每次都讓dp[666]等於0就好了,因為a[i]有負數所以要加乙個偏移量,這樣開的陣列大小將會達到 300 * 666*2,會炸記憶體,由dp[i]只能由dp[i-1]轉移過來,所以我們可以用滾動陣列優化一下

**:

#include using namespace std;

const int tot = 300 * 666;

const int mod = 1e8+7;

int dp[2][tot*2+1000] , a[333];

int main()

dp[k][tot+666] = 0;

}cout思路:我們可以得出,最後這點都會被分成幾個點集,然後每個點集都由乙個總的權值,我們在點集中的某些點中設定乙個路障就可以得到點集中所有的權值,所以我們的問題現在就變成了如何求這些點的點集,我們用並查集找到這些點集,並求這些點集的和,之後按照從大到小排序求前m個就好了,對了坑點是long long。

**:

#include using namespace std;

#define int long long

const int maxn = 1e5+10;

int p[maxn] , ans[maxn] , a[maxn];

int getf(int x)

signed main()

}for(int i = 1 ; i <= n ; i++) ans[getf(i)] += a[i];

sort(ans+1,ans+n+1,(int a,int b));

int ans = 0;

for(int i = 1 ; i <= m ; i++) ans += ans[i];

cout思路:可以發現,m只有20,那麼總共的方案數其實也就(1<<20)個,我們把這n個數放到bfs裡面跑一下,求出這n個數能夠變成的所有數所需要的最小步數,之後用m減去最小步數就好了。 這裡解釋一下

int v = (u^(1

首先我們有u這個二進位制數,我們現在由u這個數開始擴充套件,找到乙個改變u的某一位之後兩個異或會產生1的數字,那麼假設u的第j位是0,那麼我們就要找到乙個數v除了第j位位1其他都是0的數,假設u的第j位是1相反,那麼這個v就是 u^(1<**:

#include using namespace std;

const int inf = 0x3f3f3f3f;

const int maxn = 3e5+100;

char ch[maxn][22];

int dis[1<<20];

queueq;

int main()}}

int ans = inf;

for(int i = 0 ; i < (1思路:拉乙個求球冠的板子就ok了

**:#includeusing namespace std;

const int maxn = 105;

const double pi = acos(-1);

typedef struct point

point(double a, double b,double c)

point operator -(const point &b)const

point operator +(const point &b)const

//êý³ë¼æëã

point operator *(const double &k)const

point operator /(const double &k)const

double operator *(const point &b)const

}point;

double dist(point p1, point p2)

typedef struct sphere sphere;

double sphereintervs(sphere a, sphere b)

sphere qiu[maxn],s;

int main()

else if(dis + q <= p || dis + p <= q)

else

}

牛客練習賽41

相當於求n個點,已知n條邊,組成各個連通分塊,每個連通分塊有乙個和值,求出最大的幾個和值。用並查集給邊建立聯絡,計算連通塊和是 先找到那個fa點 再給該點加值。include include include include include includeusing namespace std typ...

牛客練習賽 41

a.博弈 我們發現 要麼一次拿光,要麼 m 為 1 否則都贏不了 b.dp 思路,因為有負數,如果全負數,最小為 666 300 近似於 21w 所以把錨點設為 210000,dp i j 代表 前 i 個數字 湊夠數字 j 的方案數,dp i j dp i 1 j dp i 1 j a i 但是 ...

牛客網練習賽33

tokitsukaze最近沉迷一款rpg。這個rpg一天有k分鐘,每一天從第1分鐘開始。有n種怪物,第i種怪物每天第一次出現的時間為xi分鐘,第二次出現的時間為2 xi分鐘,第三次出現的時間為3 xi分鐘.同一時刻出現的怪物種類越多,打怪獲得的經驗也越高。為了高效練級,tokitsukaze想知道在...