太残酷了,题铜牌。蒟蒻题滚粗了。前校队队长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;
}