喜聞樂見,test續集。
來上題。
題目描述
alice 和 bob 有乙個長度為2n的數。現在他們要在這個數字上玩遊戲。他們分別要從 2n 個位中取出 n 個位組成自己的幸運值。每一回合,alice 或 bob 把數字最左邊的那一位拿來放在自己幸運值的最末位。在第 i 輪操作過後,被選取的數字(原數的第i位)會從原數中消失。現在 alice 和 bob 想要使得他們兩個幸運值的和盡可能大。請求出這個值。
輸入格式
第一行乙個整數 n ,意為幸運值的長度。
第二行乙個長度為 2n 的數字,表示原數。
輸出格式
乙個整數為幸運值的和的最大值。
樣例資料
輸入
2 1234
輸出
46備註
【樣例說明】
alice 取 1、2 位。bob 取 3、4 位。幸運值分別為 12 和 34 ,和為 46 。
【資料範圍】
對 30% 的輸入資料 : n≤10;
對 100% 的輸入資料 : n≤18,原數與幸運值均允許字首 0 的存在。
用動歸。
對於乙個人的倒著數第i位對於最終答案的貢獻為a[i]*10^i。
f[i][j]表示alice取了前i位,bob取了前j位的狀態下,ans的最大值。
f[i][j]可以轉移到f[i][j+1]或者f[i+1][j],最終輸出f[n][n]。
如下。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n;
long long b[101],v[21],f[21][21],pre[21][21];
char a[101];
int main()
//兩種可能的狀態轉移方程。
if(j!=n&&f[i][j]+v[n-1-j]*(a[i+j+1]-'0')>f[i][j+1])
}cout}
題目描述
給定乙個由數字(0-9)構成的字串 s 。我們可以由此定義出 size(s) * size(s) 大小的矩陣 b ,其中 b[i][j] = s[i] * s[j] ;請問在這個矩陣 b 中,有多少子矩形滿足其中的 b[i][j] 的和為另乙個給定的數字 a 。
輸入格式
第一行乙個整數 a 。
第二行字串 s 。
輸出格式
輸出乙個整數表示滿足條件的子矩形數。
樣例資料
輸入
10 12345
輸出
6備註
【樣例說明】
b矩陣為:
01 02 03 04 05
02 04 06 08 10
03 06 09 12 15
04 08 12 16 20
05 10 15 20 25
和為10的子矩形有:
(1)
01 02 03 04
(2)
01 02
03 04
(3)
04 06
(4)
04 06
(5)
10(6)
10以上共六個。
【資料範圍】
對 10% 的輸入資料 :size(s)≤10 ;
對 30% 的輸入資料 :size(s)≤100 ;
對 100% 的輸入資料 :0≤a≤1000000000,size(s)≤4000 。
由於b[i][j] = s[i] * s[j],則矩陣的第一行和第一列為原序列,且下面所有矩陣的和都是第一行子矩陣的和的倍數,也就是第一行的子矩陣和第一列的子矩陣的乘積。即要列舉出符合提議的矩陣,應先找第一行的數,然後用找符合a/sum[x1…x2](指第一行從x1到x2的和)=sum[y1…y2](指第一列從y1到y2的和)的子矩陣的值分別有多少個,再把兩個數乘起來累加。
但如果a=0,則上述方法不成立,當sum[x1…x2]=0時,sum[y1…y2]可以取任何值。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int n,len;
int a[45000],cnt[45000];
long
long ans;
char s[45000];
int main()
}
else
}cout
0;}
題目描述
給定一張 n 個點的有向帶權完全圖,和乙個陣列 a ,請按順序刪除陣列中的點,請求出在刪除點 a[i] 以前,所有未刪除點對之間的最短路的值的和。
輸入格式
第一行乙個整數 n ,表示點數;
接下來 n 行,每行 n 個數構成鄰接矩陣,描述每條邊的權值,保證 i 號點到 i 號點的權值為 0 ;
最後一行 n 個小於等於 n 的不同的數,描述陣列 a[i]。
輸出格式
輸出 1 行 n 個數,表示答案。
樣例資料
輸入
4 0 3 1 1
6 0 400 1
2 4 0 1
1 1 1 0
4 1 2 3
輸出
17 23 404 0
備註
【資料範圍】
對 30% 的輸入資料 :1≤n≤10 ;
對 100% 的輸入資料 :1≤n≤500;0<權值≤100000 。
如果用最短路的話是會超時的呦,不論是dijkstra還是spfa。
這是考試時血與淚的教訓,一定要記得算時間複雜度和空間複雜度。
當然我們可以換種方式考慮。
把刪點的行為看作是逆向加點,即往裡面不斷加點並更新答案。
可以用floyed的思想。
因為並不是每個點的最短路都會更新,一共只有三種情況。
一是所加點到已加的所有點的路徑的更新。
二是已加的所有點到所加點的路徑的更新。
三是已加點到已加點中途經過所加點的路徑的更新。
如**。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int n;
int f[510][510],a[510];
long
long ans[510];
int main()
for(int j=n;j>i;j--)
for(int k=n;k>i;k--)
f[a[j]][a[k]]=min(f[a[j]][a[k]],f[a[j]][a[i]]+f[a[i]][a[k]]); //所加點為中途的點,第三種情況
for(int j=n;j>=i;j--)
for(int k=n;k>=i;k--)
ans[i]+=f[a[j]][a[k]];
}for(int i=1;i<=n;i++)
cout
<" ";
return
0;}
嗯,就是這樣。
來自2017.7.15
——我認為return 0,是乙個時代的終結。
暑假集訓test7
所以我又回來了,這次是test7。test1,test2,test3,集體失蹤,敬請期待 攤手 嗯,喜大普奔。上題。題目描述 給出乙個由數字 0 9 構成的字串。我們說乙個子串行是好的,如果他的每一位都是 1 8 0 7 並且這四個數字按照這種順序出現,且每個數字都出現至少一次 1118888888...
暑假集訓test14
我會告訴你test13被我吃了嗎?當然不會。哦其實還多吃了一道題。fst是一名可憐的 oier,他很強,但是經常 fst,所以 rating 一直低迷。但是重點在於,他真的很強!他發明了一種奇特的加密方式,這種加密方式只有oier 才能破解。這種加密方式是這樣的 對於乙個 01 串,他會構造另乙個 ...
暑假集訓test 8 28
大概是從我一年以來做過的最 的一套題了。乙個半小時打完三個程式三個暴力拍完以為自己ak了,開心地耍了兩個小時。結果t3要寫高精,ll炸了後4個點,中間還有個點是啥都不選的,我沒用0去更新又炸了乙個點,成功把自己炸成乙個二百五。1.最小生成樹模板題,前天那道題的 弱化 大概期望你去寫個prim但是kr...