19級暑假第一場訓練賽

2021-10-09 01:49:44 字數 3158 閱讀 5333

題目出自:codeforces round#547(div. 3)

#includeusing namespace std;

typedef long long ll;

ll n, m;

bool flag;

int cnt;

//資料不大,暴力深搜

void dfs(int now, int step)

if (now > m)return;

dfs(now * 2, step + 1);

dfs(now * 3, step + 1);

}int main()

作兩個週期大小,最大連續序列

#includeusing namespace std;

const int n = 4e5 + 50;

int n, a[n];

int main()

if (flag)return cout << 0, 0;

for (int i = n; i < 2 * n; i++) a[i] = a[i - n];

int cnt = 0, msum = 0;

for (int i = 0; i < 2 * n; i++)

cout << msum << endl;

}

做的時候用推導出數學公式但沒做特判,導致wa

wa**:

#includeusing namespace std;

const int n = 4e5 + 50;

int n, a[n];

int main()

if (flag)return cout << 0, 0;

for (int i = n; i < 2 * n; i++) a[i] = a[i - n];

int cnt = 0, msum = 0;

for (int i = 0; i < 2 * n; i++)

cout << msum << endl;

}

另一種思路

另p陣列首個為0.求出p陣列,再得到p陣列中最小的值,將p中所有數減掉最小值再加1得到原p。

同時記錄原p中每個數出現的次數。超過一次,說明不能還原 。

#include using namespace std;

typedef long long ll;

const int maxn = 2e5 + 10;

ll a[maxn];

mapb;

int main()

for (int i = 1;i <= n;i++)

b[a[i]] = 1;

}for (int i = 1;i <= n;i++)

cout << a[i] << ' ' ;

cout << endl;

return 0;

}

使用set容器

#include using namespace std;

int64_t n, m, mx, i, x, p[222000];

sets;

int main()

if (mx - m != n - 1 || s.size() < n)cout << -1;

else for (i = 0; i < n; i++)cout << p[i] + 1 - m << " ";

}

沒有做出來,感覺可以二分圖做。

貼上dalao題解

思路:

找到所有小寫字母,將它們所有的下標位置存入乙個陣列,然後每次查詢相同的字母在s1,s2中的相同字母的位置,

然後輸出就好了。

#include#include#include#include#includeusing namespace std;

const int maxn = 2e5+10;

char s1[maxn],s2[maxn];

vector v1[30],v2[30];

vector > ans;

int main(void)

for(i=0;i<=26;i++)

while(v1[i].size()>0&&v2[26].size()>0)

while(v1[26].size()>0&&v2[i].size()>0)

} printf("%d\n",cnt);

for(i=0;i

題意:有乙個怪獸,初始血量為hhh,他的血量變化情況是乙個長度為nnn輪的週期。問怪獸會在第幾輪死去。

做法首先如果怪獸血量在乙個週期內不曾小於等於000而且每個週期之後怪獸血量增加,直接輸出−1。

之後要知道,怪獸在某個完整的週期之前到達x血量,怪獸就撐不過這輪。

這個 \(x\) 的求法就是遍歷一遍週期,找到某個時刻怪獸血量消耗最多。

之後就假設怪獸初始血量為 \(h−x\) 看怪獸能撐過幾個完整的輪,設這裡輪數為 \(k\) ,每輪怪獸血量減少 \(sum\) ,則要滿足

\[sum * k + x >= h \]

\[k >= (h - x) / sum \]

所以不等式右面要上取整得到 \(k\) ,之後再 \(o(n)\) 的進行乙個週期看怪獸在第幾輪死即可。

#include#define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;

const int maxn = 2e5 + 100;

ll a[maxn];

int main()

if (flag) return cout << mark << endl, 0;

if (sum >= 0) return cout << -1 << endl, 0;

sum = -sum;

h += mi;

ll ans = h / sum * n;

ll cur = h % sum - mi;

while (cur > 0)

}printf("%lld\n", ans);

return 0;

}

暑假訓練第一場C

題目 小的時候大家一定玩過 井 字棋吧。也就是在九宮格中,只要任意行 列,或者任意連續對角線上面出現三個相同的,就能獲勝。現在小明和小花也在玩三子棋,但是他們不是在九宮格裡,而是在3 4的格仔裡面。現在小明先下,但是他知道小花這個人很聰明,他想知道第一步下在哪乙個地方最合適,你能幫幫他嗎?input...

暑假訓練第一場D

題目 s0.n 1是乙個長度為n的字串,定義旋轉函式left s s1 n 1 s0.比如s abcd left s bcda 乙個串是對串當且僅當這個串長度為偶數,前半段和後半段一樣。比如 abcabc 是對串,aabbcc 則不是。現在問題是給定乙個字串,判斷他是否可以由乙個對串旋轉任意次得到。...

牛客寒假第一場訓練賽

比賽鏈結 題解b題 構造題先找構造括號效率比較高的方法 這種括號裡面套括號效率比較高而且合法 所以思路就是對所給整數開方,剩餘的零頭我們用列舉的方法。但是對於一些資料直接用開方得到的數x構造的話,會導致零頭太小,不好構造零頭 第一步構造的是乙個對稱的括號,有x個左括號,如果零頭小於x的話,就不好構造...