题解(自记录) | 2025西安交通大学编程大赛
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
int a,b,c;cin >> a >> b >> c;
if(a==b && b==c)cout <<100+a+b+c;
else cout << a+b+c;
}
题解思路:根据题意模拟算出三张牌的总和,并检查三张牌是否两两相等,若相等则额外增加100。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
int n;cin >> n;
while(n--){
string a,b;cin >> a;
for(int j=0;j<a.size();j++){
if(a[j]=='i'||a[j]=='1'||a[j]=='l'||a[j]=='I')continue;
else b.push_back(a[j]);
}
cout << b ;
if(n!=0)cout << endl;
}
}
题解思路:由题意模拟去掉字符串中含有'i','1','I','l'的字符,然后将处理过后的字符串输出即可
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
int n;cin >> n;vector<double>ans(1ll<<9);
for(int i=0;i<(1ll<<n);i++){
double a,b;
cin >> a >> b;
a=a*a+b*b;
int cnt=0,k=i;
while(k){
if(k&1){ans[cnt]+=a;}
k >>= 1;
cnt++;
}
}
for(int i=0;i<n;i++){
cout << 1-ans[i]<<" "<<ans[i]<<endl;
}
}
题解思路:由题意,存在2n组数据,所以需要读取2n*2个数据,ans记录每位1的概率和,通过二进制算法算出每个数字代表每位1的概率之和,算完后通过1-P可得每位0的概率和,并输出
D-Symmetrical Isolation: The Battle of Black and White
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
string a;
int n,m;cin >> n >> m;int flag1=1,flag2=1;
vector<vector<int>>Map(n+5,vector<int>(m+5,0)),Map1(n+5,vector<int>(m+5,0)),Map2(n+5,vector<int>(m+5,0));
for(int i=1;i<=n;i++){
cin >> a;
a='W'+a;
for(int j=1;j<=m;j++){
if(a[j]=='B')Map[i][j]=1;
else Map[i][j]=0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
{Map1[i][j]=Map[i][j];Map2[i][j]=Map[i][j];}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(Map[i][j]==1){Map1[n-i+1][j]=1;Map2[i][m-j+1]=1;}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if((Map1[i][j]==1&&Map1[i][j-1]==1)||(Map1[i][j]==1&&Map1[i-1][j]==1)){flag1=0;}
if((Map2[i][j]==1&&Map2[i][j-1]==1)||(Map2[i][j]==1&&Map2[i-1][j]==1)){flag2=0;}
}
}
if(flag1==0&&flag2==0)cout << "No"<<endl;
else cout <<"Yes"<<endl;
}
题解思路:用二维数组记录每个位置的黑白,并分别开两个二维数组记录黑块竖直轴对称和平行轴对称,遍历这两个二维数组,若发生两个黑块相邻的情况则分别令flag1和flag2等于0,若两个都为零则无法满足题意输出No,反之Yes
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
string a;cin >> a;ll sum=0;
reverse(a.begin(),a.end());
for(int i=0;i<a.size();i++){
if(a[i]=='H'){sum+=i+1;}
}
if(sum%2==0)cout << "Bob"<<endl;
else cout << "Alice"<<endl;
}
题解思路:由题意,当杯子内液体满时自动流完,所以每个杯子的状态仅有半满和空,Alice先手,先将最右端的杯子标记为1,最左端的标记为n,记录每个半满杯子的下标,并将其全部相加,若为奇数则Alice最后倒杯子的液体,获胜,反之则Bob获胜
F-Beat Verdict: Precision Strike