題目:
1.給出乙個由0,1組成的環
求最少多少次交換(任意兩個位置)使得0,1靠在一起
n<=1000
2.兩個數列,支援在第乙個數列上區間+1,-1 每次花費為1
求a變成b的最小代價
n<=1e5
3.有n首歌,每首歌每秒有p[i]的機率被破譯(當大於等於t時自動破譯),求期望破譯歌數
題解:
t1t2都是送分題
t1 顯然列舉每個位置作為開頭就可以了
可以字首和優化到o(n)
t2我們從左往右考慮每個元素,發現對於左邊一位的操作是知道的
另外我們會發現乙個點是不可能既有+又有-操作的(很好yy)
於是就可以直接貪心了
t3首先比較容易想到的是f[i][j]表示前i個,用了t時間的概率
然後列舉經過多長時間才到下乙個來轉移
但是這樣是n*t*t的
考慮優化
我們會發現f[i][j]和f[i][j-1]就差了一點
然後通過之間關係來轉移(看**吧太複雜了)
考試的時候沒有注意最後可能未到t時間就用完了(對拍竟然也寫錯了)
然後竟然還有80
另外寫的時候有個細節就是如果上一次是k,但是這一次用時超過t了,我們要歸為上一類
這個概率的計算我們只需要通過所有的-當前還在的來計算就可以了
**:
t1:
#include usingnamespace
std;
#define rint register int
#define il inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
const
int n=3000
;char
s[n];
intn;
intmain()
int ans=1e9;
rep(i,
1,n)
cout
return0;
}
t2:
#include usingnamespace
std;
#define rint register ll
#define il inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define ll long long
const ll n=2e5;
ll a[n],b[n];
ll ans,n;
intmain()
else
lst=b[i]-a[i];
}cout
return0;
}
t3:
#include usingnamespace
std;
#define rint register int
#define il inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
intn,t;
int b[6000
];double f[2][5010],a[6000
];int
main()
num+=f[now][t]*i;
if (i==n)
double ans=0
; rep(j,
1,t) ans+=f[now][j];
num+=(jl-ans)*(i-1
); jl=ans-f[now][t];
}printf(
"%.4f
",num);
return0;
}//考試的時候少處理了最後剩餘的狀態
//對拍竟然也沒處理 還有80分
//細節就是從上一層到這一層的時候有可能會有需要超過t才能到達的需要算入上一層
清北考前刷題day1早安
立方數 cubic time limit 1000ms memory limit 128mb 題目描述 lyk定義了乙個數叫 立方數 若乙個數可以被寫作是乙個正整數的3次方,則這個數就是立方數,例如1,8,27就是最小的3個立方數。現在給定乙個數p,lyk想要知道這個數是不是立方數。當然你有可能隨機...
清北暑假模擬day1 生活
數字三角形,要求第k大的值,可以推知,如果得知k的範圍,那麼一定是在上一行可轉移狀態的對應範圍內 反證法可以證明 這個在揹包九講裡也有提及 include include include include using namespace std int n,k,f 110 110 15 z 110 1...
2016國慶清北Day2T1
pa 題目描述 漢諾塔公升級了 現在我們有n個圓盤和n個柱子,每個圓盤大小都不一樣,大的圓盤不能放在小的圓盤上面,n個柱子從左到右排成一排。每次你可以將一 個柱子上的最上面的圓盤移動到右邊或者左邊的柱子上 如果移動之後是合法的 話 現在告訴你初始時的狀態,你希望用最少的步數將第i 大的盤子移動到第i...