直接列舉−3000到3000也沒關係。
列舉最後的x,容易發現x 的取值不會在序列取值之外。
不開long long 會掛掉30分。
題目大意兩排數,你的目標是將數值相同的放到一起。
滾動不消耗代價。
提起消耗的代價為數值。
你需要最小化提起的數值限制,也就是移動的最大值盡可能小
30分演算法:
一旦乙個數值使用了第二種操作,可以直接把它看成消失了,因為可以不對剩下的數造成任何阻礙。
列舉每個數是否使用第二種操作,然後 check 一下剩下的數對中間是否都沒有障礙數。
時間複雜度o(a2n),期望得分30。
但是你只要想出了第乙個方法,你一般也就不會只有30分,但這都是後話。
60~80分演算法:
考慮一對數,如果它們跨排,那麼一定會使用第二種操作。
如果在同排,達到目標有兩種方案:自身使用第二個操作或是中間的所有數都使用了第二個操作。
• 問題轉化為了區間取max。直接迴圈掃,期望得分60∼80。
100分演算法1:
使用一些方法優化到o(nlogn) 就可以獲得滿分。
#include
#define maxn 1000010
using
namespace std;
inline
intread()
while
(isdigit
(ch)
)res=
(res<<1)
+(res<<3)
+(ch&15)
,ch=
getchar()
;return res*f;
}int n,nans[maxn]
,top;
int a[maxn]
,b[maxn]
;int ans;
int a[maxn]
,b[maxn]
;inline
bool
check
(int x)
intmain()
for(
int i=
1;i<=n;i++
)long
long l=
0,r=
1e9;
while
(l<=r)
//二分
40分演算法:一看就是dp
• 令fi表示以 i 結尾的字首的答案。列舉j#include
30分演算法:
直接暴力列舉所有可能的 01 串,並計算它與每個已有 01 串的距離,期望得分30。
基於原來30分的演算法。
對於20% 的特殊性質資料部分,直接輸出1 2 即可。
100分演算法:
將題目看成是一張 2m 個點的圖,讀入的 n−1 個 01 串是起點。
每個點都與與自己只差一位的點有連邊,邊權為1。
要找 dist 最大的點,並輸出個數。
直接 bfs 即可獲得滿分。
#include
using
namespace std;
inline
intread()
int ans,tot;
string s;
int n,m,vis[
100010
],dp[
100010];
queue<
int>q;
intmain()
while
(!q.
empty()
)}} cout<
' '<
return0;
}
文獻參考:參 暑期集訓2期5
小李是希望小學六年級的學生,在一次數學課上,張老師出了一道題,小李很快就答出來了。這個題目是這樣的 給定乙個正整數 n,請求出 2 n之間長度最長的 成等差數列的素數 質數 例如 當 n 的值為 40 時,在 2 40 之間的全部素數有 2 3 5 7 11 13 17 19 23 29 31 37...
暑期集訓2期6
如果二叉樹的左右子樹的結構是對稱的,即兩棵子樹皆為空,或者皆不空,則稱該二叉樹是對稱的。程式設計判斷給定的二叉樹是否對稱。例 如下圖中的二叉樹t1是對稱的,t2是不對稱的。二叉樹用順序結構給出,若讀到 則為空,二叉樹t1 abcde,t2 abcd e,如果二叉樹是對稱的,輸出 yes 反之輸出 n...
暑期集訓2期4
把已經買過的遊戲給標記一下,然後從第一款遊戲開始買,如果還可以買並且沒有被標記過那麼買 include using namespace std long long n,ans,num,x struct node a 100010 inline intread while isdigit ch res...