程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Codeforces Round #262 (Div. 2)解題報告

Codeforces Round #262 (Div. 2)解題報告

編輯:C++入門知識

Codeforces Round #262 (Div. 2)解題報告


 

 
有n雙襪子,每天穿一雙然後扔掉,每隔m天買一雙新襪子,問最多少天後沒有襪子穿。。
簡單思維題:以前不注重這方面的訓練,結果做了比較久,這種題自己邊模擬邊想。不過要多考慮trick
```c++
int main(){
int n, m;
long long ans = 0;
scanf(%d%d, &n, &m);
ans = n/m*m;
int tmp = n/m;
int left = tmp + n%m;
while(true){
ans += left/m*m;
tmp = left/m;
left = tmp+left%m;
if(left < m) break;
}
ans += left;
printf(%I64d , ans);
return 0;
}
```
2:B. Little Dima and Equation http://codeforces.com/contest/460/problem/B
題意:
```mathjax
求滿足方程 x = b*S(x)^{a}+c方程解 \
0 lt x lt 10^{9} , 1 le a le 5 , 1 le b le 10000 , -10000 le c le 10000\
s(x) 為x每位數的和
```
題解:如果簡單枚舉x肯定超時,但是我們可以換個角度,枚舉S(x)。這樣就簡單多了。因為根據右邊就可以算出x..
```c++

int get_sum(long long x){
int ans = 0;
while(x){
ans += x%10;
x /= 10;
}
return ans;
}
int main(){
int a, b, c;
scanf(%d%d%d, &a, &b, &c);
long long ans[maxn];
int num = 0;
for(int i = 1; i <= 81; i ++){
long long tmp = 1;
for(int j = 1; j <= a; j ++) tmp *= i;
long long temp = b*tmp + c;
if(temp > 1e9) continue;
if(get_sum(temp) == i) {
ans[num++] = temp;
}
}
printf(%d , num);
if(num > 0) {
for(int i = 0; i < num; i ++)
printf(%I64d , ans[i]);
printf( );
}
return 0;
}
```
3: C. Present http://codeforces.com/contest/460/problem/C
題意:有n朵花,給出初始高度,然後可以澆m次水,每次澆水可以澆連續的w朵,每次澆水後花都會長高1個單位。問最後最矮的那朵花最大值為多少。
題解:剛開始想,首先要貪心選出最矮的花和其相鄰的花澆水。然後是a_(i) 到a_(i+w-1)加一個單位。當時沒想到什麼好的辦法,於是我就想用線段樹維護區間最小值,每次找出最小值的下界。然後往右w多花都澆水。剛開始在求下界時想了好久,不過聯系一維情況還是寫出來了。
```c++
long long a[maxn];
long long mm[4*maxn];
int setv[4*maxn];

void build(int root, int l, int r){
int lc = 2*root, rc = 2*root+1;
if(l < r){
int mid = (l+r)/2;
build(2*root, l, mid);
build(2*root+1, mid+1, r);
mm[root] = min(mm[lc], mm[rc]);
}else{
mm[root] = a[l];
}
}

void pushdown(int root, int l, int r){
int lc = 2*root, rc = 2*root+1;
if(setv[root] > 0){
setv[lc] += setv[root];
setv[rc] += setv[root];
mm[lc] += setv[root];
mm[rc] += setv[root];
setv[root] = 0;
}
}

void pushup(int root, int l, int r){
int lc = 2*root, rc = 2*root+1;
mm[root] = min(mm[lc], mm[rc]);
}

void modify(int root, int l, int r, int x, int y, int s){
if(x <= l && r <= y){
mm[root] += s;
setv[root] += s;
}else{
pushdown(root, l, r);
int mid = (l+r)/2;
if(x <= mid) modify(2*root, l, mid, x, y, s);
if(y > mid) modify(2*root+1, mid+1, r, x, y, s);
pushup(root, l, r);
}
}

int minn;
void query(int root, int l, int r, int z){
int lc = 2*root, rc = 2*root+1 , mid = (l+r)/2;
if(l == r){
if(l < minn) minn = l;
}else{
pushdown(root, l, r);
if(mm[lc] <= z) query(lc, l, mid, z);
else query(rc, mid+1, r, z);
pushup(root, l, r);
}
}

void print(int root, int l, int r){
printf(%d %d , root, mm[root]);
if(l < r){
int mid = (l+r)/2;
print(2*root, l, mid);
print(2*root+1, mid+1, r);
}
}

int main(){
int w, n, m;
scanf(%d%d%d, &n, &m, &w);
for(int i = 1; i <= n; i ++)
scanf(%d, &a[i]);
memset(setv, 0, sizeof(setv));
build(1, 1, n);
// print(1, 1, n);
for(int i = 1; i <= m; i ++){
minn = inf;
query(1, 1, n, mm[1]);
//cout << minn << endl;
if(n-minn+1 < w) modify(1, 1, n, n-w+1, n, 1);
else modify(1, 1, n, minn, minn+w-1, 1);
}
printf(%I64d , mm[1]);
return 0;
}
```
昨晚上面兩題時間還有15分鐘左右,後兩題沒想出什麼好辦法。下次再補上。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved