訓練情況
賽後反思
打到D題擺了,連續兩道數位的智慧題?可能我比較缺觀察
A題
記錄一下字串的長度,能塞到第一行的儘量塞到第一行。
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,m; cin>>n>>m;
vector<string> s(n + 1);
for(int i = 1;i<=n;i++) cin>>s[i];
int now = 0;
for(int i = 1;i<=n;i++){
if(now + s[i].size() <= m) now += s[i].size();
else {
cout<<i-1<<endl;
return;
}
}
cout<<n<<endl;
}
signed main(){
int T; cin>>T; while(T--)
solve();
return 0;
}
B題
奇數位置+1 -1,偶數位置+1 -1,我們發現無論如何操作,奇數位和偶數位上的總和都是不變的,所以我們只需要判斷奇數位和偶數位能否均攤成對應的長度即可。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int n; cin>>n;
vector<int> a(n + 1);
for(int i = 1;i<=n;i++) cin>>a[i];
int ans1 = 0,ans2 = 0;
for(int i = 1;i<=n;i++){
if(i&1) ans1 += a[i];
else ans2 += a[i];
}
int ji = (n+1)/2;
int ou = n - ji;
if(ans1%ji==0&&ans2%ou==0&&ans1/ji==ans2/ou) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main(){
int T; cin>>T; while(T--)
solve();
return 0;
}
C題
顯然,是 \(9\) 的倍數,必須所有數位的和都是 \(9\) 的倍數,對答案有貢獻的只有數位 \(2\) 和數位 \(3\),他們對答案的貢獻分別是 \(2\) 和 \(6\),所以我們只需要統計字串中數位 \(2,3\) 出現的次數,再判斷貢獻是否能將數位和變成 \(9\) 的倍數。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
string s; cin>>s;
int ans = 0;
for(int i = 0;i<s.size();i++) ans += s[i] - '0';
if(ans%9==0){
cout<<"YES"<<endl;
return;
}
int two = 0,three = 0;
for(int i = 0;i<s.size();i++){
if(s[i] == '3') three++;
else if(s[i] == '2') two++;
}
int now = 9-ans%9;
bool flag = false;
for(int i = 0;i<=three;i++){
if(i*6 > 18) break;
for(int j = 0;j<=two;j++){
if(i*6+j*2>18) break;
if(i*6 + j*2 == now) flag = true;
if(i*6 + j*2 == now+9) flag = true;
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main(){
int T; cin>>T; while(T--)
solve();
return 0;
}