免责声明:水平有限,仅供参考
Problem A. Update
解题思路:统计不同于i的字符种数, 先用set或者map去重, 统计后输出即可
#include<bits/stdc++.h>
using namespace std;
int main(){
string s; cin>>s; int cnt=0;
unordered_map<char,int> mp;
for(auto& x:s){
mp[x]++;
}
for(auto& [x,y]:mp){
if(x!='i'){
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
Problem B. Sequence II
解题思路:感觉像线段树,没写出来
Problem C. Goose Goose Duck
解题思路:用一个优先队列进行维护每个区间即可
#include<bits/stdc++.h>
using namespace std;
struct f{
int l,r,x;
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin>>n;
vector<f> a(n);
for(int i=0;i<n;i++){
cin>>a[i].l>>a[i].r;
a[i].x=i+1;
}
sort(a.begin(),a.end(),[](auto& x,auto& y){
return x.l<y.l;
});
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
vector<int> ans;
int p=0;
int cnt=0;
while(true){
while (p<n && a[p].l<=cnt) {
pq.emplace(a[p].r,a[p].x);
p++;
}
while(!pq.empty()&&pq.top().first<cnt){
pq.pop();
}
if(pq.empty()) break;
auto[r,x]=pq.top(); pq.pop();
ans.push_back(x);
cnt++;
}
cout<<ans.size()<<endl;
for(auto& x:ans){
cout<<x<<" ";
}
return 0;
}
Problem D. CCPC
解题思路:有时间再补
#include<bits/stdc++.h>
using namespace std;
constexpr int inf=1E9;
void m_a_x(int& a,int b){
if(b>a){
a=b;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s; cin>>s;
int m; cin>>m;
int n=s.size();
vector<int> pre(n+1);
for(int i=0;i<n;i++){
pre[i+1]=pre[i]+(s[i]=='c');
}
vector<vector<vector<int>>> dp(2, vector<vector<int>>(pre[n]+1, vector<int>(m+1, -inf)));
dp[0][0][0]=0;
for(int i=0;i<n;i++){
swap(dp[0],dp[1]);
dp[0].assign(pre[n]+1, vector<int>(m+1, -inf));
for(int x=0;x<=pre[n];x++){
for(int y=0;y<=m;y++){
if(dp[1][x][y]<0){
continue;
}
int ny=y+abs(x-pre[i]);
if(ny<=m){
m_a_x(dp[0][x][ny], dp[1][x][y]+x*(x-1)/2*(pre[n]-x));
if(x<pre[n]){
m_a_x(dp[0][x+1][ny], dp[1][x][y]+(i-x)*(i-x-1)/2*(n-pre[n]-(i-x)));
}
}
}
}
}
int ans=0;
for(int i=m;i>=0;i-=2){
ans=max(ans,dp[0][pre[n]][i]);
}
cout<<ans<<endl;
return 0;
}
Problem E. Breakfast II
解题思路:有时间再补
#include<bits/stdc++.h>
using namespace std;
const int inf=1e9;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m,k; cin>>n>>m>>k;
int b,e;
cin>>b>>e;
vector<int> x(k+4),y(k+4);
int s=max((n+b-1)/b,(m+e-1)/e);
for(int i=0;i<k+4;i++){
cin>>x[i]>>y[i];
}
vector<double> dp(s+1,inf);
dp[0]=0;
for(int i=4;i<k+4;i++){
double f[4];
fill(f+1,f+4,inf);
int vis[3];
auto dfs=[&](auto&& self,int lx,int ly,double d,int c)->void{
f[c]=min(f[c],d+hypot(lx-x[3],ly-y[3]));
for(int t=0;t<3;t++){
if(!vis[t]){
vis[t]=1;
self(self,x[t],y[t],d+hypot(lx-x[t],ly-y[t]),c+1);
vis[t]=0;
}
}
};
dfs(dfs,x[i],y[i],0.0,0);
for(int x=s;x>=1;x--){
for(int j=1;j<=min(3,x);j++){
dp[x]=min(dp[x],dp[x-j]+f[j]);
}
}
}
cout<<fixed<<setprecision(10);
cout<<dp[s]<<endl;
return 0;
}
Problem F. 3 Split
解题思路:有时间再补
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin>>n;
// vector<int> a(n,vector<int>(n));
vector<vector<int>> a(n,vector<int>(n));
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
cin>>a[i][j];
a[j][i]=a[i][j]^1;
}
}
int x=0;
vector<int> vis(n);
vis[0]=1;
for(int y=1;y<n;y++){
if(vis[y]){
continue;
}
for(int z=1;z<n;z++){
if(vis[z]){
continue;
}
if(y==z){
continue;
}
if(!a[x][y]||!a[y][z]||!a[z][x]){
continue;
}
vis[y]=vis[z]=1;
vector<int> f(n);
for(int i=0;i<n;i++){
if(a[x][i]&&a[i][z]){
f[i]=1;
}else if(a[y][i]&&a[i][x]){
f[i]=2;
}else{
f[i]=0;
}
}
int fg=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if((f[i]+1)%3==f[j]&&a[j][i]){
fg=0;
}
}
}
if(fg){
vector<int> ans[3];
for(int i=0;i<n;i++){
ans[f[i]].push_back(i);
}
for(int i=0;i<3;i++){
cout<<ans[i].size()<<" \n"[i==2];
}
for(int i=0;i<3;i++){
for(int j=0;j<ans[i].size();j++){
cout<<ans[i][j]+1<<" \n"[j==ans[i].size()-1];
}
}
return 0;
}
}
}
cout<<0<<" "<<0<<" "<<0<<"\n";
return 0;
}
Problem G. Bracelet
解题思路:有时间再补
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int cnt[3]{};
for(int i=0;i<3;i++){
cin>>cnt[i];
}
string s; cin>>s;
int n=s.size();
s+=s;
int ans=0;
for(int t=0;t<2;t++){
int cur[3]{cnt[0],cnt[1],cnt[2]};
for(int i=t,j=t;i<n;i+=2){
while(j+2<=i+n && cur[s[j]-'0'+s[j+1]-'0']>0){
cur[s[j]-'0'+s[j+1]-'0']--;
j+=2;
}
ans=max(ans,j-i);
cur[s[i]-'0'+s[i+1]-'0']++;
}
}
cout<<ans<<endl;
return 0;
}
Problem H. Missing Iris
解题思路:不会
Problem I. Subnet
解题思路:将点分十进制转换成十进制整数进行判断
#include<bits/stdc++.h>
using namespace std;
int convert(string& p){
int num=0,val=0;
for (char c : p) {
if (c == '.') {
num = (num << 8)|val;
val = 0;
} else {
val =val*10 + (c-'0');
}
}
num =(num << 8)|val;
return num;
}
bool solve(string& a,string& s){
int pos=s.find('/');
string t=s.substr(0,pos);
int mask_len=stoi(s.substr(pos+1));
int x=convert(a); unsigned int y=convert(t);
unsigned int mask = ~((1 << (32 - mask_len)) - 1);
if (mask_len == 0) return true;
return (x&mask)==(y&mask);
//return true;
}
int main(){
string s; cin>>s;
int n; cin>>n;
while(n--){
string a;
cin>>a;
if(solve(a,s)){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}
Problem J. Iris’ Food
解题思路:有时间再补
#include <bits/stdc++.h>
using ll=long long
using int=long long
using namespace std;
ll mod=1e9+7;
int a[100],d[100];
ll pow(int a,int b){
if(!b) return 1;
if(b%2) return a*pow(a,b-1)%mod;
ll res=pow(a,b/2)%mod;
return res*res%mod;
}
ll add(int k){
ll ans=0;
for(int i=30;i>=0;i--) {
if(k>=(1ll<<i)){
k-=(1ll<<i);
ans=(ans*pow(10ll,(1ll<<i))%mod+d[i])%mod;
}
}
return ans%mod;
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
d[0]=1;
for(int i=1;i<=30;i++) d[i]=(d[i-1]*pow(10ll,(1ll<<(i-1)))%mod+d[i-1])%mod;
int T; cin>>T;
while(T--){
int n; cin>>n;
for(int i=0;i<10;i++) cin>>a[i];
ll ans=0;
if(a[0]&&n==1){
cout<<0<<endl;
continue;
}
for(int i=1;i<10;i++){
if(a[0]&&a[i]){
ans=i; a[i]--; n--;
ans=ans*pow(10ll,min(a[0],n))%mod; n-=a[0]; a[0]=0;
if(n<=0) break;
ans=(ans*pow(10ll,min(a[i],n))%mod+add(min(a[i],n))*i%mod)%mod;
n-=a[i];
}
else if(a[i]) {
ans=(ans*pow(10ll,min(a[i],n))%mod+add(min(a[i],n))*i%mod)%mod;
n-=a[i];
}
if(n<=0) break;
}
cout<<ans%mod<<endl;
}
return 0;
}
Problem K. Welcome
第八届河北省大学生程序设计竞赛成功举办,现在请你输出本场比赛的简称(HBCPC2024)
感谢大家的点赞和关注,你们的支持是我创作的动力!(其他细节,有时间再补充...)