不会
不会
因为 n = 8 所以我直接选择了暴力
先排个序 然后观察 对于 i 来说 往前 往后 最多能有几个会被传染 记录一下最大最小值就行了
#include
#define pb emplace_back
#define xx first
#define yy second
#define in(x) scanf("%d",&x)
#define lin(x) scanf("%lld",&x)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 2e6+10;
const int M = N*2;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const double PI = acos(-1);
ll qpow(ll a,ll b){
ll res = 1;while(b){
if(b&1) res = res*a%MOD;a = a*a%MOD;b >>= 1;}return res;}
int n,m,k;
int A[N],B[N];
char str[N];
signed main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
int T = 1; in(T);
while(T--){
in(n);
for(int i = 1;i <= n;i++)
in(A[i]);
sort(A+1,A+n+1);
int mn = n,mx = 0;
for(int i = 1;i <= n;i++){
int cnt = 0,base = A[i];
for(int j = i-1;j >= 1;j--){
if(base - A[j] <= 2) cnt++,base = A[j];
else break;
}
base = A[i];
for(int j = i+1;j <= n;j++){
if(A[j] - base <= 2) cnt++,base = A[j];
else break;
}
cnt++;
mn = min(mn,cnt),mx = max(mx,cnt);
}
cout << mn << ' ' << mx << endl;
}
return 0;
}
挺简单的一道题
首先如果斜着走比直着走两次要优 那么肯定是斜着走 反之 就直接直着走
第一种情况下 斜着走完了。肯定会剩下一段大直道 现在考虑 是斜向上 再 斜向下 走 还是 直接向右走两步 好 所以比较下 x 和 y 就行 但要注意 如果要斜着走 必须满足 min(n,m) > 1
#include
#define pb emplace_back
#define xx first
#define yy second
#define in(x) scanf("%d",&x)
#define lin(x) scanf("%lld",&x)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 2e6+10;
const int M = N*2;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const double PI = acos(-1);
ll qpow(ll a,ll b){
ll res = 1;while(b){
if(b&1) res = res*a%MOD;a = a*a%MOD;b >>= 1;}return res;}
int n,m,k;
int A[N];
char str[N];
signed main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
int T = 1; in(T);
ll x,y;
while(T--){
scanf("%d %d %lld %lld",&n,&m,&x,&y);
if(n > m) swap(n,m);
ll ans = 0;
if(2*x >= y){
// 斜着走更好
if(n == 1){
ans += x * (m-1);
}else{
// 斜向上 再 斜向下
ans += y * (n-1);
m -= n;
if(x >= y){
// 斜着走更好
ans += y * (m/2*2);
if(m&1) ans += x