J.Leaking Roof
题意:
有n×n的方格,每个格子有个高度,初始时每个格子的水量为m,每个点均匀严格由高往低流。
问最终高度为零的地方的水量,其余地方输出0即可。
Sol:按照题意,从最高地方模拟流水。注意最后输出,高度不为0的地方直接输出0.
Code:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 550;
double w[N][N];
int a[N][N];
int n, m;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
priority_queue<PII>q;
int get(int x, int y) {
return x * n + y;
}
int main(){
cin >> n >> m;
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
{
cin >> a[i][j];
q.push({a[i][j], get(i, j)});
}
while(q.size())
{
auto t = q.top(); q.pop();
int x = t.second / n, y = t.second % n;
int cnt = 0;
for(int i = 0; i < 4; ++i )
{
int xx = x + dx[i], yy = y + dy[i];
if(xx >= 0 && yy >= 0 && xx < n && yy < n && a[xx][yy] < a[x][y]) ++ cnt;
}
if(cnt){
double ave = 1.0 * (m + w[x][y]) / cnt;
for(int i = 0; i < 4; ++i)
{
int xx = x + dx[i], yy = y + dy[i];
if(xx >= 0 && yy >= 0 && xx < n && yy < n && a[xx][yy] < a[x][y])
w[xx][yy] += ave;
}
w[x][y] = 0;
}
}
for(int i = 0; i < n; ++ i, printf("\n"))
for(int j = 0; j < n; ++j)
{
if(a[i][j] == 0) printf("%.8f ", w[i][j] + m);
else printf("0 ");
}
return 0;
}
M. Addition
题意:现在将所有二进制的数的值为:
∑
i
=
0
n
−
1
v
i
⋅
s
g
n
i
⋅
2
i
\sum_{i=0}^{n-1} v_i · sgn_i · 2^i
∑i=0n−1vi⋅sgni⋅2i
现在给出a,b的二进制表达式,以及sgn的值。求出a+b的二进制表达式(保证是有解的)
32
≤
n
≤
60
32 \le n \le 60
32≤n≤60
Sol:由低到高进位。假设在第i位存在进位,那么应该在 i i i 和 i + 1 ∼ n i +1 \sim n i+1∼n之间某点与i的sgn值相同的位置之间的每位加上1.
Code:
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int sgn[N], a[N], b[N], c[N];
int n;
int main(){
cin >> n;
for(int i = 0; i < n; ++i) cin >> sgn[i];
for(int i = 0; i < n; ++i) cin >> a[i];
for(int i = 0; i < n; ++i) cin >> b[i];
for(int i = 0; i < n; ++i)
{
c[i] += a[i] + b[i];
while(c[i] >= 2)
{
c[i] -= 2;
for(int j = i + 1; j < n; ++j)
{
c[j] += 1;
if(sgn[i] == sgn[j]) break;
}
}
}
for(int i = 0; i < n - 1; ++i)
cout << c[i] << " ";
cout << c[n - 1];
return 0;
}
G. Limit
题意:
求表达式的值:
lim
x
→
0
∑
i
=
1
n
a
i
⋅
l
n
(
1
+
b
i
x
)
x
t
\lim_{x \to 0} \frac{\sum_{i=1}^{n}a_i\cdot ln(1+b_ix)}{x^t}
limx→0xt∑i=1nai⋅ln(1+bix)
Sol:洛必达,最多洛五次。
- t=0, 答案为0
- t=1, 洛必达一次:
lim
x
→
0
∑
i
=
1
n
a
i
⋅
b
i
⋅
(
1
+
b
i
x
)
−
1
\lim_{x \to 0} \sum_{i=1}^{n}a_i\cdot b_i \cdot (1+b_ix)^{-1}
limx→0∑i=1nai⋅bi⋅(1+bix)−1
答案为: ∑ i = 1 n a i ⋅ b i \sum_{i=1}^{n}a_i\cdot b_i ∑i=1nai⋅bi - t=2,洛两次, lim x → 0 ∑ i = 1 n − a i ⋅ b i 2 ⋅ ( 1 + b i x ) − 2 2 \lim_{x \to 0} \frac{\sum_{i=1}^{n}-a_i\cdot b_i^2 \cdot (1+b_ix)^{-2}}{2} limx→02∑i=1n−ai⋅bi2⋅(1+bix)−2 答案为: ( ∑ i = 1 n − a i ⋅ b i 2 ) / 2 (\sum_{i=1}^{n}-a_i \cdot b_i^2)/2 (∑i=1n−ai⋅bi2)/2
- t=3,洛三次, lim x → 0 ∑ i = 1 n a i ⋅ b i 3 ⋅ ( 1 + b i x ) − 3 3 \lim_{x \to 0} \frac{\sum_{i=1}^{n}a_i\cdot b_i^3 \cdot (1+b_ix)^{-3}}{3} limx→03∑i=1nai⋅bi3⋅(1+bix)−3答案为: ( ∑ i = 1 n a i ⋅ b i 3 ) / 3 (\sum_{i=1}^{n}a_i \cdot b_i^3)/3 (∑i=1nai⋅bi3)/3
- t=4,洛四次, lim x → 0 ∑ i = 1 n − a i ⋅ b i 4 ⋅ ( 1 + b i x ) − 4 4 \lim_{x \to 0} \frac{\sum_{i=1}^{n}-a_i\cdot b_i^4 \cdot (1+b_ix)^{-4}}{4} limx→04∑i=1n−ai⋅bi4⋅(1+bix)−4答案为: ( ∑ i = 1 n − a i ⋅ b i 4 ) / 4 (\sum_{i=1}^{n}-a_i \cdot b_i^4)/4 (∑i=1n−ai⋅bi4)/4
- t=5,洛五次,
lim
x
→
0
∑
i
=
1
n
a
i
⋅
b
i
5
⋅
(
1
+
b
i
x
)
−
5
5
\lim_{x \to 0} \frac{\sum_{i=1}^{n}a_i\cdot b_i^5 \cdot (1+b_ix)^{-5}}{5}
limx→05∑i=1nai⋅bi5⋅(1+bix)−5答案为:
(
∑
i
=
1
n
a
i
⋅
b
i
5
)
/
5
(\sum_{i=1}^{n}a_i \cdot b_i^5)/5
(∑i=1nai⋅bi5)/5
注意:洛必达的条件是,分子分母都为0。
预处理 t ⊆ 1 , 2 , 3 , 4 , 5 t\subseteq {1,2, 3,4,5} t⊆1,2,3,4,5时分子的结果,然后检查 1 ∼ t − 1 1 \sim t -1 1∼t−1分子是否为0,不是,则表示答案为 ∞ \infty ∞。最后输出 g [ t ] g[t] g[t]的结果。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 100010;
LL g[10];
LL a[N], b[N];
int n, t;
int main(){
cin >> n >> t;
for(int i = 1; i <= n; ++i)
{
cin >> a[i] >> b[i];
g[1] += a[i] * b[i];
g[2] += a[i] * b[i] * b[i] * -1;
g[3] += a[i] * b[i] * b[i] * b[i];
g[4] += a[i] * b[i] * b[i] * b[i] * b[i] * -1;
g[5] += a[i] * b[i] * b[i] * b[i] * b[i] * b[i];
}
if(t == 0) {
cout << 0;
}
else {
int i;
for(i = 1; i < t; ++i)
if(g[i] != 0){
cout << "infinity";
break;
}
if(i == t) {
if(g[t] == 0) cout << 0;
else cout << g[t] / t;
}
}
return 0;
}