2020HAUT 暑假新生訓練1 題解

2021-10-07 22:12:25 字數 4678 閱讀 7170

題意: 在二維座標系內,給你乙個起點,再給你乙個終點,外加乙個按週期迴圈的干擾因素-風,問你多少天能到達終點。簡單說,每天可以移動乙個單位,且要風力方向移動乙個單位。

題解:統計在乙個週期內每天因風力移動的距離(分為兩個方向)和 可以自由移動的次數,當自由移動的次數不小於風力影響後的位置到終點的距離時即可到達,要求最少天數,二分即可。

**:

#include

using

namespace std;

const

int maxn =

1e6+1;

int tx[maxn]

, ty[maxn]

, n, xs, ys, xe, ye;

bool

check

(long

long mid)

intmain()

long

long l =

0, r =

2e18

, ans =-1

;while

(l != r)

cout << ans << endl;

return0;

}

題意:已經統計出 「00」 ,「01」 或 「10」, 「11」 的個數,然後根據這些統計構造出字串。

題解:主要考慮 n0,n1,n2 為零時的情況,還有乙個坑點就是 n1 的奇偶性,防止無意間多 『01』 (把 『0』 移到最後即可)。

**:

#include

using

namespace std;

intmain()

return0;

}

題意:給你乙個字串,找出下標為等差數列的子序的最大個數。

題解:等差數列這個限制很苛刻的,當子序長度大於2時,子序長度為m的最大個數 <= 子序長度為m-1的最大個數,但子序長度為 1 或 2 時沒有任何限制,所以只用找到子序長度為 1 或 2 的最大個數即可。

**:

#include

using

namespace std;

long

long cnt[26]

[26], res[26]

;int

main()

res[s[i]

-'a']++

; ans =

max(ans, res[s[i]

-'a'])

;}cout << ans << endl;

return0;

}

題意:給你乙個長度為 n 的陣列,陣列中有值為 -1 的元素,把所有的該種元素用乙個數值 x 替換,使得陣列中相鄰元素的差值最小。

題解:把所有該種元素相鄰的元素存入乙個陣列中,排個序,x = (最大值+最小值) / 2,然後再遍歷一遍陣列得到最大差值即可。

**:

#include

using

namespace std;

const

int maxn =

1e6+1;

long

long a[maxn]

, b[maxn]

;int

main()

sort

(b+1

, b+tot+1)

;long

long m =

0, k =0;

if(tot !=

0) m = b[1]

+ b[tot]

>>1;

for(

int i =

1; i <= n;

++ i)

cout << k <<

" "<< m << endl;

}return0;

}

題意:給你乙個01串的長度n,再給01串中1的個數,問怎麼構造使得含 1 的子串最多,輸出最多的個數。

題解:如果 1 都集中在一起,含 1 的子串是多了,但此時 0 也都集中在一起了,那只含 0 的子串也多了,子串總數是一定的,所以這種貪心是有問題的。我們在把 0 都分散,那只含 0 的子串最少,而子串總數是一定的,所以把 0 分散後統計出只含 0 子串的個數即可。

**:

#include

using

namespace std;

intmain()

return0;

}

題意:在一維座標系上,給你 n 個區間,讓你創造乙個區間,若你的區間包裹了 n 個區間中的一些區間,則你的區間獲得這些包裹區間的價值,且你的區間每包含乙個點價值就 -k 。

題解:線段樹模板題,先建乙個線段樹把所有區間都包裹在內,然後列舉右端點,對左端點進行字首和處理——右端點之前的點到達右端點的花費,每次列舉都對左端點字首和進行實時更新,且維護乙個最大價值的區間。

**:

#include

using

namespace std;

const

int maxn =

2e5+1;

typedef

long

long ll;

struct node

node

(int l,

int r, ll val, ll lazy):l

(l),

r(r)

,val

(val)

,lazy

(lazy)

node

(int l,

int id, ll val):l

(l),

id(id)

,val

(val)

bool

operator

<

(const node n1)

node operator+(

const node n1)

}p[maxn <<2]

,res(1

,0,0ll);

vector g[maxn]

;// 以i結尾的區域

void build (

int root,

int l,

int r)

int mid = l+r >>1;

build

(root<<

1,l,mid)

;build

(root<<1|

1,mid+

1,r)

; p[root]

= p[root<<1]

+ p[root<<1|

1];}

void

pushdown

(int root)

}void updata (

int root,

int l,

int r,

int ul,

int ur,

int i, ll val)

pushdown

(root)

;int mid = l+r >>1;

if(mid >= ur)

updata

(root<<

1,l,mid,ul,ur,i,val)

;else

if(mid < ul)

updata

(root<<1|

1,mid+

1,r,ul,ur,i,val)

;else

p[root]

= p[root<<1]

+ p[root<<1|

1];}

intmain()

build(1

,1, m)

;for

(int i =

1; i <= m;

++ i)

if(res.val ==0)

vector<

int> ans;

for(

int i = res.l; i <= res.r;

++ i)

}printf

("%lld %d %d %d\n"

, res.val, res.l, res.r, ans.

size()

);for(

auto i: ans)

printf

("%d "

, i)

;return0;

}

題意: 給你乙個數字t,給乙個字串s。找到滿足 a-b2+c3-d4+e5 = t 的最大字典序 abcde ,且a、b、c、d、e都屬於s,若無解輸出 「no solution」 。(a = 1, b = 2 … z = 26)

題解:字串 s 按字典序從大到小排列,dfs一下即可。

**:

在這裡插入**片#include.h>

using

namespace std;

int t; string s;

int flag, a[6]

, b[

100]

;void

dfs(

int depth)

return;}

for(

int i = s.

size()

-1; i >=0;

-- i)

}int

main()

return0;

}

新生訓練2

時間匆忙,先把自己 弄上明天考完再做詳細題解和補剩下的題 昨天組長在報告上說我題解認真,感到十分愧疚,來補題解,所以抓緊來補題解 a.b.c d eat candies 讀懂題很容易理解,先取最大的,然後如果最大的值大於另外兩個的和,則最大天數等於另外兩個的和,否則取另外兩個和與最大天數差值,除於2...

JXUST ECJTU新生訓練賽

a.此題由於字串的長度是10 5,所以利用o n 2 暴力來做的話,顯然是超時的,所以不採用這種方法,我們可以計算每個字元 出現的次數,而題目中 告訴pairs x,y and y,x should be considered different,所以組成的個數總和就是 每個字元出現的次數的乘積之和...

2021新生訓練題解02

a 思路 dp 由於每乙個點只能從該點的左側或上側到達,因此到達該點的最小花費一定在到達該點上側和左側之前產生,可得轉移方程 dp i j min dp i 1 j dp i j 1 注意特判i 1 0和 j 1 0 的情況 標程 b 思路 數學幾何 沿著柱面向上走,可將柱面展開,變成乙個矩形,兩點...