#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
2e5+10;
vector<
int> mp[maxn]
;int n,m,s[maxn]
;int ans=
0,mx;
void
dfs(
int i,
int pre,
int cnt)
//pre是父親節點 不能往回走
intmain()
for(
int i=
1;i)dfs(1
,-1,
0); cout
}
#include
main()
printf
("%d"
,dp[n]);
}
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
1e5+
100;
intmain()
if(num0==n&&n&
1) s[0]
=0;//cout(n&1
&&num0!=n) s[xx]
=-s[xx]-1
;for
(int i=
0;i)printf
("%d "
,s[i]);
return0;
}
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
3e5+
100;
int n,num,s[maxn]
,st[maxn][2
],cnt=0;
intmain()
int a,b;
while
(q[0
]!=mx)
ll x;
while
(num--
)return0;
}
#include
main()
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
3e5+
100;
int num[maxn]
,s[maxn][2
],st[maxn]
;int
main()
x=s[0]
[0],y=s[0]
[1];
int num1=
0,num2=
0,num3=0;
//num1含有兩個數的區間數,num2含有第乙個數的區間數,num3含有第二個數的區間數(num2,num3包括num1)
memset
(st,0,
sizeof st)
;for
(int i=
1;i(num1==m-
1||m==
1) flag=1;
//全都含有兩個數或只有乙個區間
else
//分別模擬
int mx=0;
for(
int i=
1;i<=n;i++
) mx=
max(num[i]
,mx);if
(mx+num2==m-1)
//第乙個區間沒統計所以是m-1
flag=1;
else
//統計num3 同上
int mx=0;
for(
int i=
1;i<=n;i++
) mx=
max(num[i]
,mx);if
(mx+num3==m-1)
flag=1;
}}if(flag)
puts
("yes");
else
puts
("no");
return0;
}
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
3e5+
100;
int n,m,s[maxn]
;bool
check
(int x)
else
if(s[i]
}return1;
}int
main()
else
l=mid+1;
} cout
}
很容易就會想到dp了 但是3w*3w的陣列太大了,不現實,看了網上幾篇題解都說dp[i][ j]
表示上一次跳 j 步到達i點的最大價值,還說 j 只用開到500就可以了 ,我覺得說錯了 因為如果第一步的d 大於500 就會直接越界了 這種說法有問題,**沒問題d ! ! !
最開始想的dp[ i ][ j ] 中 j 直接表示上一次跳的距離,這樣行不通,那可不可以委婉的表示,每次距離的變化值只有三個數 -1 0 1 但是用這三個數表示的話就太亂了 只知道你上次變化量,跳了了幾步就不知道了,缺少參考值 其實我們有乙個很好的參考值-> d
即: 用dp[ i ] [ j ] 表示跳到 i 點上步距離是 d+j 沒毛病吧 那我們來看看 j 的範圍有多大 就直接用他們的250 吧 如果到達dp[ i ][ 250 ] 那麼一定是從dp[i][249] 過來的
那麼最短的跳過的距離和是多少: d + (d+1)+(d+2)+ … +(d+249)+(d+250)
求和後為 d * 250+250 * 251 / 2 且d>0 所以已經大於三萬了 可以滿足題目要求了
為啥要開500 呢 因為有正有負 250*2 完全可以了
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
3e4+10;
int dp[
500]
[maxn]
,num[maxn]
;//dp的i j 互換了~~
intmain()
int ans=num[d]
; dp[
250]
[d]=num[d]
;//250-250 就是差值為0 了
for(
int j=d;j)for
(int i=
1;i<
500;i++)if
(dp[i]
[j]!=-1
)//} cout
}
第三次訓練J題
問題簡述 給出若干組成員,當該組成員中有乙個是嫌疑人時,所有組員均為嫌疑人,預設成員0必為嫌疑人。問題分析 當具備某個條件時,將兩者歸為同乙個集合。顯然為並查集問題。程式說明 當一者為嫌疑人 父節點為0 時,將雙方的父節點都置為0,最後再遍歷所有成員使用一次find函式,避免有成員的父節點為除0外的...
中石油新生第三次訓練賽 C題進製轉換(奇葩解)
題目描述 樂樂正在學進製轉換,但他老是搞不清楚到底自己是否做對,請你編一程式實現兩種不同進製之間的資料轉換,幫他檢驗。輸入 共有三行,第一行是乙個正整數,表示需要轉換的數的進製n 2 n 16 第二行是乙個n進製數,若n 10則用大寫字母a f表示數碼10 15,並且該n進製數對應的十進位制的值不超...
2015暑假第三次積分賽
題目位址 a alphabet cookies 水 題目大意 輸入2個字串,能否在第乙個字串中找到字元組成第二個字串,字串全大寫 解題思路 水 include include include include include include include include include includ...