CF global 13 B做题笔记(看清题目和数据范围)
这题没注意ai的范围时[1,1e6],以为他是所有列都会有障碍,卡了好久。(太菜了)。
题目不是一定要走边缘,不要只看翻译!!!!
以后写题注意看清题目范围,这不是第一次了,qwq。
题意
从(1,0)走到(n,1e6+1)。每一行都有一个障碍且障碍的范围是从第一列到第1e6列。
将障碍左右移一格花费u,上下移动一格花费v。问最少花费。
思路
如果所有障碍变成一堵墙的话答案就是min(u+v,v+v),
不是一堵墙但是挡住了向右移动的路答案是min(u,v),
其他情况就是0。
#include <iostream> #include<stdio.h> #include <cstring> #include <algorithm> #include <string.h> #include <queue> //#include <bits/stdc++.h> #define pb push_back #define qc std::ios::sync_with_stdio(0); #define maxn 0x3f3f3f #define debug(x) cout<<"debug"<<x<<endl; using namespace std; const int max_n=35; const int min_n=10000000; typedef long long ll; typedef unsigned long long int ul; typedef double dl; int a[5005]; int main() { int t; cin>>t; while(t--) { int n,u,v; cin>>n>>u>>v; int flag1=1,flag2=1; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } ll ans; /* if(n==2) { if(a[1]==a[2]) ans=min(u+v,v+v); else if(a[1]+1==a[2]||a[1]-1==a[2]) ans=min(u,v); else ans=0; } else { if(a[1]==a[2]&&a[n]==a[n-1]) ans=u+v; else if(a[1]+1==a[2]||a[1]-1==a[2]) { if(a[n]+1==a[n-1]||a[n]-1==a[n-1]) ans=u; else ans=0; } else ans=0; }*/ for(int i=1;i<n;i++) { if(abs(a[i]-a[i+1])<=1) { if(abs(a[i]-a[i+1])!=0) flag2=0; } else flag1=0; } if(flag1==1) { if(flag2==1) ans=min(u+v,v+v); else ans=min(u,v); } else { ans=0; } cout<<ans<<endl; } }