題意:給出乙個n*m的矩陣,找出有如下條件的三角形的個數:
1.三角形的三個頂點均為格點,即橫座標和縱座標均為整數。
2.三角形的面積為1
3.三角形至少有一條邊和x軸或y軸平行。
思路:滿足條件的三角形有兩類:1、底為1,高為2;2、底為2,高為1。
使底邊分別平行於x軸和y軸,其中會有重複的,計算中減去即可。
**
#include
#include
#include
#include
#include
#include
using namespace std;
const
int mod =
1e9+7;
intmain()
簽到題,根據概率算期望
**
#include
#include
#include
#include
#include
#include
using namespace std;
intmain()
簽到題,標記陣列,遍歷找到未被標記的位置
**
#include
#include
#include
#include
#include
#include
using namespace std;
intmain()
for(
int i=
1;i1;i++)}
printf
("%d\n"
,ans)
;return0;
}
題意:給出乙個正整數x,求其因子數,令x等於其因子數,再求x因子數並x等於其因子數,不斷迭代下去,最終x會等於2。求這個過程需要迭代多少次
思路:o( n
\sqrt
n) 求因子數 模擬過程
for迴圈中i開long long **
#include
#include
#include
#include
#include
#include
using namespace std;
const
int mod =
1e9+7;
intmain()
} n = num;
} cout << ans << endl;
return0;
}
題意:擷取一段最短的連續字串,子串中至少包括k個相同的某個字母
思路:尺取法,,用map儲存了尺取維護的區間中的字母的個數
**
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const
int mod =
1e9+7;
const
int inf =
0x3f3f3f3f
;int
main()
if(sum < k)
break
; ans =
min(r - l, ans)
; mp[s[l]]-
=1;if
(s[l]
== s[r -1]
) sum -=1
; l +=1
;}if(ans == inf) cout <<-1
<< endl;
else cout << ans
}
題意:乙個 「01」串而言,每次操作可以把 0 字元改為 1 字元,或者把 1 字元改為 0 字元,最多可操作k次。在操作之後找出乙個盡可能長的連續子串,這個子串上的所有字元都相同。
思路:k次操作,只能是全部將0變成1,或者全部將1變成0。全部將0變成1:先移動右端點,遇到0則將可操作次數-1(將0變為1,但不改變真值),如果可操作次數為0,就移動左端點,當左端點遇到0,可操作次數+1,重新迴圈。全部將1變成0,操作相同。兩種可能都執行找出最大值。
**
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const
int mod =
1e9+7;
const
int inf =
0x3f3f3f3f
;int
main()
r++;}
ans =
max(r - l, ans);if
(r >= n)
break
;while
(s[l]
!='0'
) l++
; num--
; l++;}
//將1變為0
l =0, r =
0, num =0;
while(1
) r++;}
ans =
max(r - l, ans);if
(r >= n)
break
;while
(s[l]
!='1'
) l++
; num--
; l++;}
cout << ans << endl;
return0;
}
題意:給出乙個長度為n字串,「nico」 計a分,「niconi」 計b分,「niconiconi」 計c分。已被計數過的字元不能重複計數,找出最大的計數分數。
思路:線性dp
if (s.substr(i - 3, 4) == 「nico」) dp[i]=max(dp[i],dp[i−4]+a)
if (s.substr(i - 5, 6) == 「niconi」) dp[i]=max(dp[i],dp[i−6]+a)
if (s.substr(i - 9, 10) == 「niconiconi」) dp[i]=max(dp[i],dp[i−10]+a)
**
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef
long
long ll;
const
int mod =
1e9+7;
const
int inf =
0x3f3f3f3f
;const
int e =
3e5+5;
ll dp[e]
;int
main()
if(i >=
5&& s.
substr
(i -5,
6)=="niconi")if
(i >=
9&& s.
substr
(i -9,
10)=="niconiconi")}
cout << dp[n -1]
<< endl;
return0;
}
牛客寒假演算法基礎集訓營1
菜雞乙個,只做出兩道,先掛一下,剩下的會了繼續更 1 小a的計算器 題目描述 小a的數學基礎實在太差了,以至於他只會用計算器算數。他的計算器比較特殊,只有 即加減乘除 四種運算。經過一番周折,小a終於算出了他想要的數,但是他卻忘記了最初的數是什麼。不過幸運的是他記下了整個操作序列,他想請你幫他算出最...
牛客寒假演算法基礎集訓營
首先看到這個題目資料範圍就可以知道這不是乙個可以暴力過的題。所以應該要推乙個結論。我們可以將這個同學的一來一回看成一組,那麼就可以理解為乙個來回中n可以減少n m 1 個人。那麼我們現在要讓所有人都進去,那就是看n m 1 的數量。但是有可能存在一些情況,就是說當你的倒數第二組中的回來的那趟使得n變...
2020牛客寒假演算法基礎集訓營1
找規律,推公式 三角形個數為2 m n m n m 1 n 1 2 m n mn m 1 n 1 2 m n mn m 1 n 1 include include include include using namespace std typedef long long ll const int m...