By 虎皮玄椒
457 字
2 分钟
CF699
A. Launch of Collider
有 个点,向左右以单位速度移动,问第一次碰撞的时间。
当且仅当前面一个点向右,后面一个点向左时会发生碰撞,找到距离最近的两个点,距离除以二即为答案。
signed main(){ int n;cin>>n; string s;cin>>s; vector<int> p(n); for(int i=0;i<n;i++)cin>>p[i]; int ans=0x7fffffff; for(int i=1;i<n;i++){ if(s[i]=='L'&&s[i-1]=='R')ans=min((p[i]-p[i-1])/2,ans); } if(ans==0x7fffffff)cout<<"-1\n"; else cout<<ans<<endl; return 0;}B. One Bomb
大小为 的矩阵,矩阵中有若干点位有障碍物。炸弹可以清除所在行列的所有障碍物。问是否有一位置可以放置一个炸弹后清除所有障碍物。
记录每行每列的障碍物数量 hang[n] lie[m],以及总数量 tot。
对于一位置 ,若当前位置有障碍物,则当 hang[i]+lie[j]==tot+1 时,该位置即为答案;若没有障碍物,则当 hang[i]+lie[j]==tot 时,该位置即为答案。
若不存在位置,即无正确答案。
signed main(){ int n,m;cin>>n>>m; int tot=0; vector<string> g(n); vector<int> hang(n),lie(m); for(int i=0;i<n;i++){ cin>>g[i]; string s=g[i]; for(int j=0;j<m;j++){ if(s[j]=='*'){ hang[i]++; lie[j]++; tot++; } } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(g[i][j]=='*'){ if(hang[i]+lie[j]-1==tot){ cout<<"YES\n"<<i+1<<' '<<j+1<<endl; return 0; } }else{ if(hang[i]+lie[j]==tot){ cout<<"YES\n"<<i+1<<' '<<j+1<<endl; return 0; } } } } cout<<"NO\n"; return 0;}C. Vacations
共 天,每天有健身房是否开门,是否有比赛,组合共四种状态。若不参加比赛且不去健身房则为休息,求休息的最少天数。
反方向思考,休息的最少天数即为总天数减去工作的最多天数。
有 dp[i][j] 为第 i 天参与活动 j 的最多工作天数,当 j 分别为 0, 1, 2 时,对应 休息,健身,比赛。
具体状态转移见代码。
signed main(){ int n;cin>>n; vector<int> a(n); vector<vector<int>> dp(n,vector<int>(3)); for(int i=0;i<n;i++)cin>>a[i]; dp[0][0]=0; dp[0][1]=(a[0]==1||a[0]==3?1:0); dp[0][2]=(a[0]==2||a[0]==3?1:0); for(int i=1;i<n;i++){ dp[i][0]=max(dp[i-1][0],max(dp[i-1][1],dp[i-1][2])); dp[i][1]=(a[i]==1||a[i]==3?max(dp[i-1][0],dp[i-1][2])+1:dp[i][0]); dp[i][2]=(a[i]==2||a[i]==3?max(dp[i-1][0],dp[i-1][1])+1:dp[i][0]); } if(a[n-1]==3)cout<<n-max(dp[n-1][0],max(dp[n-1][1],dp[n-1][2])); else if(a[n-1]==2)cout<<n-max(dp[n-1][0],dp[n-1][2]); else if(a[n-1]==1)cout<<n-max(dp[n-1][0],dp[n-1][1]); else cout<<n-dp[n-1][0]; return 0;}部分信息可能已经过时
