題意:
a(codeforces - 1257e):三組數,按順序最多分成三組,求數字移動的最小次數。
b(codeforces - 1257c):找乙個陣列的子陣列,要求除頭尾兩數相同外,中間包含的數互不相同。
c(codeforces - 1257a):讓兩個位置的數,在指定步數內距離盡可能的大。
d(codeforces - 1257d):有 n 個怪獸和 m 個英雄,每個怪獸有乙個能力值 a,每個英雄有乙個能力值 p 和 耐力值 s。每天都要派乙個英雄去牢房裡清理怪獸,當英雄的能力值大於怪獸時才能清理掉怪獸,每清理乙個怪獸,該英雄耐力值減 1 ,當耐力值減完或者不能打敗這個怪獸時這一天便結束。問最少要花多少天才能打完所有的怪獸。
e(codeforces - 1257f ):有n個數,要求找到乙個數x,使得每個數都與x異或後,所有數的二進位制表示中的1的數量一樣
補題:a codeforces - 1257 e the contest(dp)
思路:,對問題i,j來說,若i#include
using
namespace std;
typedef
long
long ll;
const ll maxn=
2e5+5;
ll a[maxn]
,dp[maxn][4
];intmain()
for(
int i=
1;i<=n2;i++
)for
(int i=
1;i<=n3;i++
) n=n1+n2+n3;
memset
(dp,63,
sizeof dp)
; dp[0]
[1]=
0;for(
int i=
1;i<=n;i++)}
} cout<<
min(dp[n][1
],min(dp[n][2
],dp[n][3
]))<}b codeforces - 1257 c dominated subarray
思路:對每個「不是第一次出現」的數與它「上一次出現」的位置進行距離計算並比較取最小值。
**:
d codeforces - 1257 d yet another monster killing problem(貪心)#include
#define ll long long
using
namespace std;
int t,n,a[
200010
],b[
200010
],ans;
intmain()
b[a[i]
]=i;}if
(ans==
999999999
) cout<<-1
cout<}}
思路:記錄每個耐力值下,英雄的最大能力值。優先選擇能力值大且耐力值大的英雄。mx[i]: 耐力值為 i 時的最大能力值。每次找最大的能力值(乙個英雄可以清的怪數)
**:
感想:b題在題意理解上浪費了好多時間,都題目的限制條件理解的比較模糊。c題還是想用暴力解,未果,再對題目要求進一步簡化理解。f昨天原題,算是昨天印象比較深刻的題之一,思路來的比較快。d題的話貪心要求弄暈了,不知道貪心策略怎麼選比較好…#include
#include
#include
using
namespace std;
const
int maxn =
2e5+5;
int a[maxn]
,p[maxn]
;int
main()
for(
int i=n-
1;i>
0;i--
) p[i]
=max
(p[i]
,p[i+1]
);int ans=
0,cnt=0;
while
(cntelse
} cout << ans << endl;
}return0;
}
暑假訓練第一周第六天
題意 a codeforces 1249 c1 c2 找乙個最小的大於n的數,要求是3的冪次和且每個次數最多出現一次。b codeforces 1249a 一組數,如果有兩數之差為一,把他們放在兩個不同的組裡。c codeforces 1249 d1 d2 給多組線段,每乙個點的覆蓋次數不超過k,每...
訓練總結 18 7 19 暑假訓練第四天
今天上午新開的專題做了三道題,是之前做過的題。之前把思路理清了做起來還是比較順利。下午的比賽,雖然之前有心理準備,但做起來還是怪難受的。簽個到都難,最後那道題目,一開始想著預處理一下,然後直接查詢。但是怎麼找也找不到預處理的方法,大小區間之間也沒有明確的關係。後來聽別人的思路才知道可以用樹狀陣列 離...
演算法訓練第一周
leetcode 283 移動零 基礎寫法 class solution 設定指標i j 遍歷nums i 當nums i 0 即當值不為0時 nums j nums i j int j 0 for int i 0 i i 可以使i j指標同時向右移 只有當nums i 0 j才移動 造成j指標是慢...