欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

Codeforces Round #262 (Div. 2)解题报告_html/css_WEB-ITnose

程序员文章站 2022-05-19 08:05:07
...
详见:http://robotcator.logdown.com/posts/221514-codeforces-round-262-div-2

1:A. Vasya and Socks http://codeforces.com/contest/460/problem/A

有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 }
ans += left;
printf("%I64d\n", 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 long long tmp = 1;
for(int j = 1; j long long temp = b*tmp + c;
if(temp > 1e9) continue;
if(get_sum(temp) == i) {
ans[num++] = temp;
}
}
printf("%d\n", num);
if(num > 0) {
for(int i = 0; i printf("%I64d ", ans[i]);
printf("\n");
}
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 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 mm[root] += s;
setv[root] += s;
}else{
pushdown(root, l, r);
int mid = (l+r)/2;
if(x 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 }else{
pushdown(root, l, r);
if(mm[lc] else query(rc, mid+1, r, z);
pushup(root, l, r);
}
}

void print(int root, int l, int r){
printf("%d %d\n", root, mm[root]);
if(l 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 scanf("%d", &a[i]);
memset(setv, 0, sizeof(setv));
build(1, 1, n);
// print(1, 1, n);
for(int i = 1; i minn = inf;
query(1, 1, n, mm[1]);
//cout if(n-minn+1 else modify(1, 1, n, minn, minn+w-1, 1);
}
printf("%I64d\n", mm[1]);
return 0;
}
```
昨晚上面两题时间还有15分钟左右,后两题没想出什么好办法。下次再补上。