訓練情況
賽後反思
好吧,D 題沒想到二進位制列舉,以為 \(O(2^knm)\) 不可做。。。
A題
要求要等差數列,我們先求公差,為兩元素的最大值-最小值,再在最大值的基礎上加上公差即可。
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int a,b; cin>>a>>b;
cout<<max(a,b) + max(a,b) - min(a,b);
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
B題
我竟然沒想到 scanf ,我超,這題直接 scanf 讀入兩個 long long 再相減即可,寫了字串做法,字串做法就是找 ,
,之後把字串變成數字,答案是 \(b-a-1\)。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
string s; cin>>s;
int n = s.size();
int pos = 0;
for(int i = 0;i<n;i++){
if(s[i] == ','){
pos = i;
break;
}
}
int a = 0;
for(int i = pos+1;i<n;i++){
if(s[i] == ',') break;
a*=10;
a+=s[i] - '0';
}
for(int i = n-1;i;i--){
if(s[i] == ','){
pos = i;
break;
}
}
int b = 0;
for(int i = pos+1;i<n;i++){
b*=10;
b+=s[i] - '0';
}
cout<<b-a-1<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
C題
我們考慮可以將終點關於水面進行對稱,已知中點和一邊,求另外一邊的公式為 \(2 \times mid - l\),所以我們直接 \(2 \times m - z\) 求出對稱的另一點高度,所以向量就是 \((x,y,2m-z)\),求三數的 gcd 再除化成最簡即可,這題 int 會溢位,需要開 long long。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,m; cin>>n>>m;
for(int i = 1;i<=n;i++){
int x,y,z; cin>>x>>y>>z;
int ansx = x;
int ansy = y;
int ansz = 2*m-z;
int g = __gcd(ansx,__gcd(ansy,ansz));
cout<<ansx/g<<" "<<ansy/g<<" "<<ansz/g<<endl;
}
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}