2024年2月(第三场)USACO计算机竞赛银牌题目解析来咯,代码解析等你来解密!

时间:2024-02-23 13:12:49  作者:网络 来源:网络

图片

本周,2024年第三场USACO月赛已经落下帷幕,没有当场晋级的同学可以等待一周左右的时间,Sharon老师整理了本次USACO竞赛月赛全部真题解析,需要的同学可以添加老师微信:X-NEW999免费领取!

一起来看看本次月赛🥈银牌试题解析代码+视频吧!

 

- X-NEW-

USACO 2024年2月银牌第一题

图片

图片

题解视频分析

 
 
 
 
代码
下滑查看完整代码解析

#include <bits/stdc++.h>

using namespace std;

const int N=1e6+10;

#define int long long

struct re{

int X1,X2,Y1,Y2;

};

re ve[N];

int mx,mn,gg;

vector<int> v1,v2;

bool check1(vector<pair<int,int> > S, int x){

vector<int> v;

if (gg==-1){

v=v2;

} else v=v1;

vector<int> q;

for (auto v:S){

q.push_back(floor((long double)1.0*(v.second-x)/v.first)); 

}

sort(q.begin(),q.end());

sort(v.begin(),v.end());

for (int i=0;i<v.size();i++)

  if (v[i]>q[i]) return 0;

return 1;

}

bool check2(vector<pair<int,int> > S, int x){

vector<int> v;

if (gg==-1){

v=v2;

} else v=v1;

vector<int> q;

for (auto v:S){

q.push_back(ceil((long double)1.0*(v.second-x)/v.first)); 

}

sort(q.begin(),q.end());

sort(v.begin(),v.end());

for (int i=0;i<v.size();i++)

  if (v[i]<q[i]) return 0;

return 1;

}

 

void solve(vector<pair<int,int> > S,int g){

gg=g;

int h=-4e18,t=4e18;

while (h<t){

int mid=(h+t+1)/2;

if (check1(S,mid)) h=mid;

else t=mid-1;

}

mn=min(mn,h); 

h=-4e18,t=4e18;

while (h<t){

int mid=(h+t)/2;

if (mid<0) mid=(h+t-1)/2;

if (check2(S,mid)) t=mid;

else h=mid+1;

}

mx=max(mx,h);

}

signed main(){

ios::sync_with_stdio(false);

int T;

cin>>T;

while (T--){

int n,X1,Y1,Y2,X2;

cin>>n>>X1;

vector<pair<int,int> > S1,S2;

vector<int> jl;

for (int i=1;i<=n;i++){

cin>>Y1>>Y2>>X2;

jl.push_back(Y1); jl.push_back(Y2);

S1.push_back({X2,Y2});

S2.push_back({X2,Y1});

}

v1.clear(); v2.clear();

vector<int> ss;

for (int i=1;i<=4*n;i++){

int x;

cin>>x;

ss.push_back(abs(x));

if (x>0) v1.push_back(x);

else v2.push_back(x);

}

if (v1.size()<n||v2.size()<n){

cout<<-1<<endl;

continue;

}

int k=v1.size()-n;

sort(jl.begin(),jl.end());

reverse(jl.begin(),jl.end());

for (int i=0;i<k;i++)

  S2.push_back({X1,jl[i]});

for (int i=k;i<jl.size();i++)

  S1.push_back({X1,jl[i]});

mn=1e18;

mx=0;

sort(ss.begin(),ss.end());

// if (ss[0]==ss.back()){

// for (auto v:S1){

// mn=min(mn,-v.first*(-ss[0])+v.second);

// mx=max(mx,-v.first*(-ss[0])+v.second);

// }

// for (auto v:S2){

// mn=min(mn,-v.first*(ss[0])+v.second);

// mx=max(mx,-v.first*(ss[0])+v.second);

// }

// } else{

solve(S1,-1); 

solve(S2,1);

// }

cout<<mx-mn<<endl;

}

return 0;

}

 

 

USACO 2024年2月银牌第二题

图片

图片

题解视频分析

 
 
 
 

代码

下滑查看完整代码解析

#include <bits/stdc++.h>

#define endl "\n" 

using namespace std;

string s1,s2;

int main(){

ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)

int T;

cin>>T;

while (T--){

int n,m;

cin>>n>>m;

cin>>s1>>s2;

vector<pair<int,int> > ans;

vector<int> v1,v2;

int t3=0;

for (int i=0;i<n;i++)

  if (i==0||s1[i]!=s1[i-1]) v1.push_back(s1[i]-'0');

for (int i=0;i<n;i++)

  if (i==0||s2[i]!=s2[i-1]) v2.push_back(s2[i]-'0');

bool tt=0;

if (v2[0]==v1.back()){

tt=1;

swap(v1,v2);

}

if (v1.size()==1){

tt^=1;

swap(v1,v2);

}

// if (v1.size()<v2.size()) {

//   tt=1;

//   swap(v1,v2);

// }

int k=v2.back();

if (!(v1[0]==v2.back()||(v2.size()==1))){

k=3-k;

ans.push_back({2,3});

v2.pop_back();

}

reverse(v1.begin(),v1.end());

for (auto v:v1){

if (v==k){

ans.push_back({1,2});

} else{

ans.push_back({1,3});

t3++;

}

}

if (v2.size()==1){

if (ans.back().second==3) {

ans.pop_back(); t3--;

}

if (t3>0) ans.push_back({3,1});

} else{

if (ans.back().second==2){

ans.pop_back();

}

reverse(v2.begin(),v2.end());

for (auto v:v2)

  if (v==k) {

  ans.push_back({2,1});

  } else{

  ans.push_back({2,3});

  }

if (ans.back().second==3){

ans.pop_back();

ans.push_back({3,2});

}

cout<<ans.size()<<endl;

if (m==1) continue;

for (auto &v:ans){

if (tt){

if (v.first<=2) v.first=3-v.first;

if (v.second<=2) v.second=3-v.second;

}

cout<<v.first<<" "<<v.second<<endl;

}

}

 

return 0;

}

/*

4

3 2

121

212

*/

 

USACO 2024年2月银牌第三题

 

图片

图片

题解视频分析

 
 
 
 
代码
下滑查看完整代码解析

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N=1e6;

int f[N],g[N],h[N];

int n,m,k,a[N][6];

signed main(){

ios::sync_with_stdio(false);

int T;

cin>>T;

while (T--){

cin>>n>>m>>k;

for (int i=1;i<=m;i++)

  for (int j=1;j<=k;j++)

    cin>>a[i][j]; 

for (int i=1;i<=m;i++){

int ans=0;

int mn=1e9;

for (int j=1;j<=k;j++) mn=min(mn,a[i][j]);

for (int j=1;j<=k;j++)

  ans+=a[i][j]%2;

if (ans==k||ans==0){

f[i]=mn;

} else {

int mx[2]={0,0};

for (int j=1;j<=k;j++)

  mx[a[i][j]%2]=max(mx[a[i][j]%2],a[i][j]);

f[i]=-min(mx[0],mx[1]);

}

h[i]=f[i];

f[i]+=f[i-1];

}

g[m+1]=f[m];

for (int i=m;i>=1;i--){

  g[i]=min(g[i+1],f[i]);

}

if (g[1]+n<=0){

cout<<-1<<endl;

continue;

}

vector<int> v;

for (int i=1;i<=m;i++){

int mx=0;

for (int j=1;j<=k;j++)

  if (a[i][j]%2==1) mx=max(mx,a[i][j]);

mx=-mx;

if (mx==0) mx=h[i];

if (mx+n+min(0ll,g[i+1]-f[i])<=0) {

v.push_back(1);

n+=h[i];

} else{

v.push_back(0);

n+=mx;

}

}

for (int i=0;i<v.size();i++){

if (v[i]==0) cout<<"Even";

else cout<<"Odd";

if (i+1!=v.size()) cout<<" ";

}

cout<<endl;

}

 

return 0;

}

图片
USACO计算机竞赛月赛时间表

图片

 

如果本场USACO竞赛银组月赛顺利晋级,下一场月赛中则可以参加黄金组别,黄金组别考试难度大致相当于大学计算机专业算法课程水平。参赛者需要有一定算法基础,理解一些抽象方法(例如:最短路径,动态规划),并且对数据结构有比较深了解。

如果本场月赛没能晋级,则可以等待结果公布后参加下一场月赛。(一般来说,高于750分或800分的分数通常可以获得晋级资格。)

图片

 

 

- X-NEW-

添加下方二维码

领取USACO竞赛资料和备考规划

👇👇👇

 

 

 

 

 

 

WeChat:X-NEW999

关键字:USACO,USACO竞赛,USACO培训班,USACO竞赛辅导,USACO计算机竞赛,

推荐资讯
Contact Us