太残酷了,题铜牌。蒟蒻
题滚粗了。前校队队长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;
}
京公网安备 11010502036488号