我们发现一种最优策略,把石头按照斜线摆,即
(
1
,
1
)
,
(
2
,
2
)
,
(
3
,
3
)
,
…
(1,1),(2,2),(3,3),\dots
(1,1),(2,2),(3,3),…
如果
min
(
n
,
m
)
<
k
\min(n,m)< k
min(n,m)<k,则策略如下:
- 在 ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) , … , ( min ( n , m ) , min ( n , m ) ) (1,1),(2,2),(3,3),\dots,(\min(n,m),\min(n,m)) (1,1),(2,2),(3,3),…,(min(n,m),min(n,m)) 处摆上一块石头
- 剩余的
k
−
min
(
n
,
m
)
k-\min(n,m)
k−min(n,m) 块石头就随便摆,因为不管怎么摆,小 U 的操作数是不可能大于
min
(
n
,
m
)
\min(n,m)
min(n,m) 的。
否则,策略如下: - 在 ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) , … , ( k , k ) (1,1),(2,2),(3,3),\dots,(k,k) (1,1),(2,2),(3,3),…,(k,k) 处摆上一块石头。
#include <bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
typedef pair<int, int> pr;
#define up(i, l, r) for(int i = (l); i <= (r); i++)
#define down(i, r, l) for(int i = (r); i >= (l); i--)
const int mod = 1000000007;
const int base = 2333;
const double eps = 1e-6;
inline int read() {
int x = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }
return x * f;
}
int n, m, k, Q, T, _;
char ans[2007][2007];
signed main() {
T=read();
while(T--){
n=read(),m=read(),k=read();
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans[i][j]='.';
}
}
for(int i=1;i<=min(n,m);i++){
if(cnt==k)break;
cnt++;
ans[i][i]='S';
}
int num=k-cnt;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ans[i][j]=='S')cout<<ans[i][j];
else{
if(num>0)cout<<'S',num--;
else cout<<'.';
}
}
cout<<endl;
}
}
return 0;
}
标签:cnt,ch,min,int,题解,Radiation,LAOI,long,read
From: https://blog.csdn.net/juan_wang123/article/details/142028262