训练情况
赛后反思
打到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;
}
标签:991,int,Codeforces,long,CodeForces,solve,return,数位,define
From: https://www.cnblogs.com/longxingx/p/18593354