打了差不多一年的cf發現自己是div3選手,也可能是div4+選手。
這一題就是簡單的模擬題。
#include
using
namespace
std;
long
long main() else
}cout
<< n << endl;
return
0;}
這題是說要算一下哪個長度為2的子串出現次數最多,那麼就統計一下吧。
#include
using
namespace
std;
const
int maxn = 30;
int cnt[maxn][maxn];
char ss[110];
int main()
int mx = -1;
int ii = -1;
int ij = -1;
for(int i = 0; i < 26; i++) }}
printf("%c%c", ii+'a', ij+'a');
return
0;}
這題的主要問題在於,可能有一點點小的細節。
另外還有乙個問題是,如果不認真看題,可能會以為要找出乙個嚴格大於k個數的數出來,而不是大於等於,至少我是這麼看錯的。看錯的原因是,給的樣例恰好是大於的。具體的細節請看**。主要是要特判k==0。
**寫的有點蠢,但是還是過了。
#include
#include
using
namespace
std;
const
int maxn = 2e5 + 10;
const
int inf = 0x3f3f3f3f;
int a[maxn];
int main()
a[n+1] = inf;
sort(a + 1, a + n + 1);
if(k == 0) else
return
0; }
int cnt = 0;
int t = a[k];
int index = k;
int tem = k;
for(int i = k + 1; i <= n; i++) else
}if(index == k) else
return
0;}
這題我感覺我寫了乙個假演算法啊,但是不知道為什麼能pp。結果最後還是過了。。不是很懂
大概思路是,先預處理出乙個後面可以接哪乙個。b陣列表示後面接哪個,c陣列表示前面接哪個。
後來請教了一下,發現我這個演算法沒有問題。
事情是這樣的,可以發現,對於這堆數,每個數都可以表示為a∗
2x∗3
y a∗2
x∗3y
,只有x和y是變化的,而x變大,y變小,所以應該是乙個雙關鍵字排序,至於這個排序怎麼排,也是有講究的,比如說你真的算出x和y,然後排序,這個可以,但是實際上算出乙個就夠了,因為因數分解下來的那個a是一樣的。由於題目保證了有解,所以我這裡的做法,就恰好也保證了排序。
#include
#include
using
namespace
std;
int n;
long
long a[110];
int b[110];
int c[110];
int main()
for(int i = 1; i <= n; i++) else
if(a[i] * 2 == a[j]) }}
int ss = -1;
for(int i = 1; i <= n; i++)
}while(ss != 0)
return
0;}
這道題的思路可以是這樣的:
找出所有的聯通塊。這裡可以用dfs來實現。
把判斷每個聯通塊是不是都是合法的。我同學講說看邊數與點數是否相等,這個實現起來應該也不難,應該也是對的吧。還有一種做法是,判斷每個點的度是否為2.
#include
#include
using
namespace
std;
const
int maxn = 2e5 + 10;
vector
v[maxn];
vector
g;bool used[maxn];
void dfs(int x)
}}int main()
int cnt = 0;
for(int i = 1; i <= n; i++)
g.clear();
dfs(i);
bool ok = true;
for(int ii : g)
}if(ok)
}printf("%d", cnt);
return
0;}
我的想法是這樣的:
用dp[x]表示以x為結尾的串的長度,那麼如果出現了乙個數x,那麼這時候更新dp[x],dp
[x]=
max(
dp[x
−1]+
1,dp
[x])
d p[
x]=m
ax(d
p[x−
1]+1
,dp[
x]
)。然後有一種像我這樣很蠢但是也是很簡單易懂的做法是,這時候已經知道子串的所有元素資訊了,那麼在原來的串中找出來就行了。子串的第乙個元素是x−
dp[x
]+1 x−d
p[x]
+1
,然後依次在數列中找出大乙個的數。
#include
#include
using
namespace
std;
const
int maxn = 2e5 + 10;
map dp;
int a[maxn];
int main()
int mx_cnt = -1;
int mi = -1;
for(auto a : dp)
}int cnt = mx_cnt;
printf("%d\n", cnt);
int num = mi - cnt + 1;
for(int i = 1; i <= n; i++)
}return
0;}
codeforces 977F dp回溯路徑
題意 找出子串行中,連續嚴格上公升的序列的最大長並列印位置。這裡dp i 表示第i個結尾的最大上公升長度。dp i max dp i 1 1 這裡a i 很大,我們採用map。題目要求列印路徑我們就記錄乙個前驅 我這裡寫的略顯臃腫,腦子抽了 include include include inclu...
977 有序陣列的平方
利用 陣列 nums 已經按照公升序排序 這個條件。顯然,如果陣列 nums 中的所有數都是非負數,那麼將每個數平方後,陣列仍然保持公升序 如果陣列 nums 中的所有數都是負數,那麼將每個數平方後,陣列會保持降序。因此就可以使用歸併的方法進行排序。使用兩個指標分別指向位置 0 和 n 1,每次比較...
977 有序陣列的平方
題意理解 給定遞增陣列,把陣列元素平方後遞增輸出。思路 可能含有負數,但是存在乙個負數和正數的分界線neg。利用雙指標,從neg和neg 1向兩邊遍歷,把小的push進ans中,直至到達一邊的邊界,這時把另一邊剩下的順序push進ans中就可以了。麻煩的地方在於要做邊界 檢查。另一種反向思路 雙指標...