太残酷了,题铜牌。蒟蒻
题滚粗了。前校队队长lzh
题
(太猛了)。
C HW的糖果俱乐部
签到题。直接算出所有数的和。如果和是偶数,直接输出,否则找到一个最小的奇数并减去它。
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int a[10000050]; int sum=0; for(int i=0;i<n;++i)cin>>a[i],sum+=a[i]; if(sum%2==0)cout<<sum; else{ sort(a,a+n); for(int i=0;i<n;++i){ if(a[i]&1){ sum-=a[i]; cout<<sum; return 0; } } } return 0; }
E 有趣的圆柱体
其实也是签到题。看起来写了多行,但是很多是复制粘贴的。
#include<bits/stdc++.h> using namespace std; const double PI=acos(-1); struct Point { double x,y,z; }p[10000050]; double dis(const Point &a,const Point &b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)); } int main() { int t; cin>>t; while(t--){ int n; cin>>n; for(int i=0;i<n*2;++i){ cin>>p[i].x>>p[i].y>>p[i].z; } map<double,int>mx,my,mz; for(int i=0;i<n*2;++i){ ++mx[p[i].x],++my[p[i].y],++mz[p[i].z]; } int state=-1; for(auto i:mx){ if(i.second==n){ state=0; break; } } if(state==-1){ for(auto i:my){ if(i.second==n){ state=1; break; } } } if(state==-1){ for(auto i:mz){ if(i.second==n){ state=2; break; } } } if(state==0){ double edge=1e10; for(int i=0;i<2*n;++i){ for(int j=i+1;j<2*n;++j){ if(p[i].x!=p[j].x)continue; edge=min(edge,dis(p[i],p[j])); } } edge/=2.0; double r=edge/sin(PI/n); double h; bool ok=false; for(int i=0;i<n*2;++i){ for(int j=i+1;j<n*2;++j){ if(p[i].y==p[j].y&&p[i].z==p[j].z){ h=dis(p[i],p[j]); double ans=PI*r*r*h; printf("%.10lf\n",ans); ok=true; break; } } if(ok)break; } }else if(state==1){ double edge=1e10; for(int i=0;i<2*n;++i){ for(int j=i+1;j<2*n;++j){ if(p[i].y!=p[j].y)continue; edge=min(edge,dis(p[i],p[j])); } } edge/=2.0; double r=edge/sin(PI/n); double h; bool ok=false; for(int i=0;i<n*2;++i){ for(int j=i+1;j<n*2;++j){ if(p[i].x==p[j].x&&p[i].z==p[j].z){ h=dis(p[i],p[j]); double ans=PI*r*r*h; printf("%.10lf\n",ans); ok=true; break; } } if(ok)break; } }else{ double edge=1e10; for(int i=0;i<2*n;++i){ for(int j=i+1;j<2*n;++j){ if(p[i].z!=p[j].z)continue; edge=min(edge,dis(p[i],p[j])); } } edge/=2.0; double r=edge/sin(PI/n); double h; bool ok=false; for(int i=0;i<n*2;++i){ for(int j=i+1;j<n*2;++j){ if(p[i].x==p[j].x&&p[i].y==p[j].y){ h=dis(p[i],p[j]); double ans=PI*r*r*h; //cout<<r<<endl<<h<<endl; printf("%.10lf\n",ans); ok=true; break; } } if(ok)break; } } } return 0; }
G 字符串解压
这道题被lzh押中了,所以没有花太多时间就写出来了(不过为什么这题的代码行数比E题还短)。
#include<bits/stdc++.h> using namespace std; string unzip(const string &s) { string ans,compressed; int in=0,times=0; for(int i=0;i<s.size();){ if(isdigit(s[i])){ while(isdigit(s[i])){ times=times*10+s[i]-'0'; ++i; } ++i; ++in; while(1){ if(s[i]=='['){ ++in; compressed+="["; ++i; } else if(s[i]==']'){ --in; if(in!=0){ compressed+=']'; ++i; }else{ ++i; break; } }el***pressed+=s[i++]; } } while(times--){ ans+=compressed; } times=0; compressed=""; }else{ ans+=s[i++]; } } return ans; } int main() { string s; while(cin>>s){ for(int i=0;i<s.size();){ if(isdigit(s[i])){ s=unzip(s); i=0; }else{ ++i; } } cout<<s<<endl; } return 0; }