題目出自: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的話,就不好構造...