訓練情況
賽後反思
D題應該能出的,只是晚自習的debuff疊滿了
A題
判斷 \(4\) 個數是否相等,排序判斷首位是否一樣即可。
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int a[4];
for(int i = 0;i<4;i++) cin>>a[i];
sort(a,a+4);
if(a[0] != a[3]) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main(){
int T; cin>>T; while(T--)
solve();
return 0;
}
B題
簡單分類討論,如果是紅燈答案是剩餘紅燈時間+過馬路時間,如果是綠燈但是來不及就是剩餘綠燈時間+紅燈時間+過馬路時間,如果是綠燈來得及就是過馬路時間。
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int x,y,k,t; cin>>x>>y>>k>>t;
string s; cin>>s;
if(s == "G"){
if(k >= t) cout<<t<<endl;
else cout<<k+x+t<<endl;
} else if(s == "R"){
cout<<k+t<<endl;
}
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
C題
這題不需要在意操作次數,把所有的 \(1\) 都變成 \(0\) 即可,記錄 \(1\) 的位置直接輸出即可。
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n; cin>>n;
string s; cin>>s;
vector<int> ans;
for(int i = 0;i<n;i++){
if(s[i] == '1') ans.push_back(i);
}
cout<<ans.size()<<endl;
for(auto i:ans){
cout<<i+1<<" "<<i+1<<endl;
}
}
signed main(){
int T; cin>>T; while(T--)
solve();
return 0;
}
E題
這題寫了一個 floyd 全源最短路,輸出了前 \(100\) 的答案,我們透過觀察發現有規律,對於 \(\le 10\) 的部分我們直接輸出,之後就是一個長度為 \(4\) 的迴圈節。
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
const int N = 1e3;
int dis[N][N];
int a[21] = {0,0,3,1,4,0,7,1,8,0,11};
void solve(){
int n; cin>>n;
// cout<<n<<" ";
if(n<=10) cout<<a[n]<<endl;
else {
int tn = n;
n-=11;
if(n%4==0) cout<<1<<endl;
else if(n%4 == 1) cout<<tn<<endl;
else if(n%4 == 2) cout<<0<<endl;
else cout<<tn+1<<endl;
}
}
signed main(){
int T; cin>>T; while(T--)
solve();
return 0;
}