457 字
2 分钟
CF699

A. Launch of Collider#

nn 个点,向左右以单位速度移动,问第一次碰撞的时间。

当且仅当前面一个点向右,后面一个点向左时会发生碰撞,找到距离最近的两个点,距离除以二即为答案。

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#

大小为 n×mn \times m 的矩阵,矩阵中有若干点位有障碍物。炸弹可以清除所在行列的所有障碍物。问是否有一位置可以放置一个炸弹后清除所有障碍物。

记录每行每列的障碍物数量 hang[n] lie[m],以及总数量 tot。 对于一位置 (i,j)(i,j),若当前位置有障碍物,则当 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#

nn 天,每天有健身房是否开门,是否有比赛,组合共四种状态。若不参加比赛且不去健身房则为休息,求休息的最少天数。

反方向思考,休息的最少天数即为总天数减去工作的最多天数。 有 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;
}
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

CF699
https://leaf146.cn/posts/cf699
作者
LeAf146
发布于
2026-07-08
许可协议
MIT

部分信息可能已经过时