1.6 SMU Winter 2023 Round #2 (Div.2)
SMU Winter 2023 Round #2 (Div.2)
思路:排列后,输出第二大的数
int main(){ int t,a[5]; cin>>t; while(t--){ for(int i=0;i<3;++i){ cin>>a[i]; } sort(a,a+3); cout<<a[1]<<'\n'; } return 0; }
1760B - Atilla's Favorite Problem
思路:找出字典序最大的字母
int main(){ string s; int t,c; cin>>t; while(t--){ cin>>c>>s; int ma=-1; for(int i=0;i<s.size();++i){ int b=s[i]-'a'+1; ma=max(ma,b); } cout<<ma<<'\n'; } return 0; }
思路:Y → e,e → s,s → Y,判断每个字符后是否如此
void solve(){ bool k=true; for(int i=0;i<s.size()-1;++i){ if(s[i]=='Y'&&s[i+1]!='e'||s[i]=='e'&&s[i+1]!='s'||s[i]=='s'&&s[i+1]!='Y') { k=false;break; } } if(k)cout<<"YES"; else cout<<"NO"; }
思路:算出1~max中没有的数的和,从max+1开始加直到满足条件
void solve(){ for(int i=0;i<m;++i){ cin>>x; ma=max(ma,x); a[x]=true; } int all=0; for(int i=1;i<=ma;++i){ if(!a[i])all+=i; } if(all<s) { for (int i = ma + 1;; ++i) { all += i; if (all >= s)break; } } if(all==s)cout<<"YES"<<'\n'; else cout<<"NO"<<'\n'; }
思路:存所有不同的数,统计形成“山谷”的数量,为1则yes
for(int i=0;i<x;++i){ cin>>m; if(i==0||m!=a.back()) a.push_back(m); } for(int i=0;i<a.size();++i){ if((i==0||a[i-1]>a[i])&&(i==a.size()-1||a[i]<a[i+1])) ans++; } if(ans==1)cout<<"YES"<<'\n'; else cout<<"NO"<<'\n';
思路:1.原数组的值 2.将第一个0 → 1 后的值 3.将最后一个1 → 0 后的值 ,取最大值
int x=find(a.begin(),a.end(),0)-a.begin(),y=find(a.rbegin(),a.rend(),1)-a.begin(); for(int i=n-1;i>=0;--i){ if(a[i]==0)s++; if(a[i]==1)all+=s; } ans=max(ans,all);
思路:先降序排列,求出前缀和,k从 ’可以为任意值的最小值‘ 开始遍历,最大情况下,可以将d分成d/k段,用前缀和求出总共的最大和s,若满足s>=c,即可知道k的范围,反之不存在
int cmp(int a,int b){ return a>b; } int main(){ long long t; cin>>t; while(t--){ long long n,c,d,m; cin>>n>>c>>d; vector<int>a; vector<long long>h(n+5,0); a.push_back(0x3f3f3f3f); for(int i=1;i<=n;++i){ cin>>m; a.push_back(m); } sort(a.begin(),a.end(),cmp); for(int i=1;i<=n;++i) h[i]=h[i-1]+a[i]; h[0]=0; int k=d; while(k>=1){ int i=k; if(n<k)i=n; int x=d/k,y=d%k; if(y>n)y=n; long long s=h[i]*x+h[y]; if(s>=c){ if(k==d)cout<<"Infinity\n"; else cout<<k-1<<'\n'; break; } k--; } if(k<1)cout<<"Impossible\n"; } }
思路:每次找出除自己以外的最大值
int main(){ int t,x,b[N]; cin>>t; while(t--){ cin>>x; vector<pair<int,int>>a(x); for(int i=0;i<x;++i){ cin>>a[i].first; a[i].second=i; b[i]=a[i].first; } sort(a.begin(),a.end()); int k; for(int i=0;i<x;++i){ k=x-1; while(a[k].second==i){ k--; } cout<<b[i]-a[k].first<<' '; }cout<<'\n'; } return 0; }
思路:对原序列排列后,从小的开始,分别算乘以2和3后的答案
int solve(int u,long long hh,int s2,int s3){ if(u==n)return 0; if(hh>a[u])return solve(u+1,hh+(a[u]>>1),s2,s3)+1; //两种情况 int ans2= s2? solve(u,hh*2,s2-1,s3) : 0; int ans3= s3? solve(u,hh*3,s2,s3-1) : 0; return max(ans2,ans3); } while(t--){ cin>>n>>h; for(int i=0;i<n;++i)cin>>a[i]; sort(a,a+n); cout<<solve(0,h,2,1)<<'\n';//a[]从小的开始,更新h,*2,*3 }
思路:一对2和5可以凑10,先统计n中2和5的个数,在小于m的基础上,补齐2或5,尽可能使个数相同
int main(){ ll t,m,n; cin>>t; while(t--){ cin>>n>>m; int nn=n; int cnt2=0,cnt5=0; ll k=1; while(n>0&&n%2==0){ n/=2;cnt2++; } while(n>=0&&n%5==0){ n/=5;cnt5++; } while(cnt2<cnt5&&k*2<=m){ cnt2++;k*=2; } while(cnt5<cnt2&&k*5<=m){ cnt5++;k*=5; } while(k*10<=m){ k*=10; } if(k==1)cout<<nn*m<<'\n'; else{ k*=m/k; cout<<nn*k<<'\n'; } } return 0; }
思路:
有5种可能:
1.a=b
2.一步: |a-b| ≤ x
3.两步: |a-l|≤x 和 |b-l|≤x 或 |a-r|≤x 和 |a-r|≤x,即a→l→b 或 a→r→b
4.三步:a→l→r→b 或 a→r→l→b
5. -1
int main(){ ll t,l,r,x,a,b; cin>>t; while(t--){ cin>>l>>r>>x>>a>>b; if(a==b)cout<<"0"<<'\n'; else if(abs(a-b)>=x)cout<<"1"<<'\n'; else if(min(a,b)-l>=x||r-max(a,b)>=x)cout<<"2"<<'\n'; else if(r-b>=x&&a-l>=x||r-a>=x&&b-l>=x)cout<<"3"<<'\n'; else cout<<"-1\n"; } return 0; }
1760G - SlavicG's Favorite Problem
思路:分别对a,b求到每个点的x,若存在相同的,说明a可以在最多跳跃一次的情况到达b,用set记录dfs a时求出的x,dfs b时判断即可
const int N=2e5+10; int n,a,b; vector<pair<int,int> >ve[N]; set<int> s; void dfs1(int u,int fa,int x){ if(u==b)return ; s.insert(x); for(auto e:ve[u]){ int v=e.first,w=e.second; if(v==fa)continue; dfs1(v,u,w^x); } } bool dfs2(int u,int fa,int x){ if(u!=b&&s.count(x))return true; for(auto e:ve[u]){ int v=e.first,w=e.second; if(v==fa)continue; if(dfs2(v,u,x^w))return true; } return false; } int main(){ int t; cin>>t; while(t--){ s.clear(); cin>>n>>a>>b; for(int i=1;i<=n;++i)ve[i].clear(); for(int i=1;i<n;++i){ int u,v,w; cin>>u>>v>>w; ve[u].push_back({v,w}); ve[v].push_back({u,w}); } dfs1(a,-1,0); if(dfs2(b,-1,0))cout<<"YES\n"; else cout<<"NO\n"; } return 0; }