sol:第一題就dp?!然後寫了o(n^2) dp再
考慮優化!!!(盡量部分分帶上!!!)
我寫了正確的dp然後優化錯了,具體的dp方法是考慮到對於右側到左側他是沒有後效性的
所以定義f[i]為i及以後最大的代價和,對於合法的j,轉移f[i]=max,j需要滿足a[i]+x[i]=i
由於給出的a[i]遞增然後我只要往i的右側找到第乙個合法的j然後轉移就行了,複雜度o(n log n)
我錯在了用堆來優化,然後把後面的刪掉了,其實可以再前面的從被誤刪的東西轉移而來。
sol:這道題目對於100%的資料n,m<=3000,顯然發現這一定是o(n2)的演算法,
然後如果對於x1到x2的最短路徑設為r1,x3到x4最短路勁r2,要求r1和r2交的盡可能多,那麼這個解一定更優
首先一定要在最短路上,其次要求r1和r2盡可能交的更多,我們不妨設剛開始交的地方設為i,交結束的地方設為j
我們先求出x1,x2,x3,x4到各點的最短路d1,d2,d3,d4
我們列舉i然後再列舉j 由上圖可以看出就是d1[i]+d2[j]+d3[i]+d4[j]+dist(i,j)在列舉j之前我們可以o(n)求出i的最短路d5
那麼就是最小化d1[i]+d2[j]+d3[i]+d4[j]+d5[j],
然後我們交換(x1,x2)or (x3,x4) 之中的任意一對然後再求min,就是d1[i]+d2[j]+d3[j]+d4[i]+d5[j],
然後對於每一次列舉ans=min(d1[i]+d2[j]+d3[i]+d4[j]+d5[j],d1[i]+d2[j]+d3[j]+d4[i]+d5[j],ans)
對於乙個顯然的情況我們最後特判就是直接 x1走到x2,x3 走到 x4 最短路雖然並沒有重複的路 即 ans=min(ans,d1[x2]+d3[x4]);
code:
# include # ifdef o_2# pragma gcc optimze(2)
# endif
using
namespace
std;
const
int maxn=3005
;int
n,m,x1,x2,x3,x4;
intd1[maxn],d2[maxn],d3[maxn],d4[maxn],d5[maxn];
int tot=0
,head[maxn];
bool
vis[maxn];
struct reca[maxn*2
];inline
intread()
inline
void write(int
x)
if (x>9) write(x/10
); putchar('0
'+x%10);}
inline
void writeln(int x)
void adde(int u,int v,int
w)struct node;
intd[maxn];
queue
q;void bfs(int
s));
while (!q.empty()) );}}
}int min(int a,int b,int
c)int
main()
bfs(x1); memcpy(d1,d,
sizeof
(d));
bfs(x2); memcpy(d2,d,
sizeof
(d));
bfs(x3); memcpy(d3,d,
sizeof
(d));
bfs(x4); memcpy(d4,d,
sizeof
(d));
int ans=m;
for (int i=1;i<=n;i++)
ans=min(ans,d1[x2]+d3[x4]);
writeln(ans);
return0;
}
解密模擬題
現有加密二進位制檔案乙份,按規則進行解碼 a.轉碼後檔案由0x1b,0x4c開頭 b.跳過原始檔前六個位元組,每兩個位元組為乙個迴圈節 c.獲取初始key,由md5 hello 檔名 的前8位構成 d.對初始key進行如下操作 高4位 0x41a70000 0x7fff0000 低4位 0x41a7...
模擬題總結
1 模擬題的常見題型 1 打表,列出所有可能 資料較少,規律明顯 2 分階段求解,自頂向下,先寫出主程式,然後輸入輸出,判斷條件這些直接用函式實現,簡化步驟。3 模擬操作,有兩種思路,一是直接模擬,得出結果 二是先記錄所有操作,然後模擬每個操作。4 日期天數,可以逐年,逐月,逐日的相加,然後求星期之...
noip模擬題 挖掘機(模擬題 精度)
這題直接模擬。可是我掛在了最後兩個點上qaq。唯一注意的是注意精度啊。用來double後邊轉成整數就忘記用longlong。sad include include include include include include include include include using namesp...