当前位置: 代码迷 >> 综合 >> CCPC-Wannafly Winter Camp Day2 (Div2)
  详细解决方案

CCPC-Wannafly Winter Camp Day2 (Div2)

热度:4   发布时间:2023-12-26 09:48:31.0

目录

A  Erase Numbers II

B Erase Numbers I

H Cosmic Cleaner


A  Erase Numbers II

【分析】题目要求删除序列中的数字使其只剩下2个数字,并且拼接后数字最大。因为拼接,所以直接用字符串处理会比较方便。最后讲了之后发现其实数据范围这里是有坑的。然鹅我们直接用字符串处理。

  1. 自定义函数,比较两个串对应数值的大小;
  2. 3个一组进行比较,循环下去固定l和r值最后拼接即可

【代码】

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <map>
#include <cmath>
using namespace std;
typedef long long ll;const int maxn=1e4;
string a[maxn];int cmp(string s1,string s2)
{int len1=s1.length();int len2=s2.length();if(len1>len2)return 1;else if(len1<len2)return 0;if(s1>s2)return 1;return 0;
}
int main()
{int t;scanf("%d",&t);int ca=0;while(t--){int n;scanf("%d",&n);for(int i=0;i<n;i++)cin>>a[i];string l=a[0],r=a[1];string f1,f2,f3;for(int i=2;i<n;i++){f1=l+r;f2=l+a[i];f3=r+a[i];if(cmp(f1,f2)&&cmp(f1,f3))l=l,r=r;else if(cmp(f2,f1)&&cmp(f2,f3))l=l,r=a[i];else if(cmp(f3,f1)&&cmp(f3,f2))l=r,r=a[i];}string ans=l+r;printf("Case #%d: ",++ca);cout<<ans<<endl; }
}

B Erase Numbers I

【题目】同上,但是是只删除两个使得剩余的数字最大。

【分析】分类讨论。情况挺多的。(队友的

【代码】

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long LL;
const int maxn=10000;
string a[maxn];
int pos=-1,n;
int cmp(string s1,string s2)
{int l1=s1.size();int l2=s2.size();if(l1>l2)return 1;else if(l1<l2)return 0;if(s1>s2)return 1;else return 0;
}
int findlen()
{int len=0x3f3f3f3f;//printf("%d\n",len);for(int i=0;i<n;i++){if(a[i].size()<len && i!=pos)len=a[i].size();}//printf("%d\n",len);return len;
}
int main()
{int t;scanf("%d",&t);int cnt=1;while(t--){pos=-1;scanf("%d",&n);for(int i=0;i<n;i++){cin>>a[i];}int len=findlen();for(int i=0;i<n;i++){if(a[i].size()==len){pos=i;break;}}//printf("pos=%d\n",pos);int pos1=pos,flag=1;for(int i=pos+1;i<n;i++){if(a[i].size()==a[pos1].size()){if(a[i]>a[pos1] && flag)break;else if(!flag || a[i]<a[pos1]){pos1=i;flag=1;}}else if(a[pos1].size()<a[i].size()){if(a[i]>a[pos1] && flag==1)break;else flag=0;}else pos1=i;}//printf("pos1=%d\n",pos1);len=findlen();for(int i=0;i<n;i++){if(a[i].size()==len && i!=pos1){pos=i;break;}}int pos2=pos;flag=1;for(int i=pos+1;i<n;i++){if(i!=pos1){if(a[i].size()==a[pos2].size()){if(a[i]>a[pos2] && flag)break;else if(!flag || a[i]<a[pos2]){pos2=i;flag=1;}}else if(a[pos2].size()<a[i].size()){if(a[i]>a[pos2] && flag==1)break;else flag=0;}else pos2=i;}}//printf("pos2=%d\n",pos2);printf("Case #%d: ",cnt++);for(int i=0;i<n;i++){if(i!=pos1 &&i!=pos2)cout<<a[i];}cout<<endl;}
}

 

H Cosmic Cleaner

【分析】弱弱地说一句...套的板子...  https://blog.csdn.net/enterprise_/article/details/81624174

主要是两个公式啦球体积:V=πR^{3}

  • 球的体积:V=\frac{4}{3}\pi r^{3}
  • 球缺体积:V=\pi H^{3}(r -\frac{H}{3})

【代码】

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
const double PI = acos(-1.0);
const int maxn=1000;
//板子 
typedef struct point 
{double x,y,z;point() {}point(double a, double b,double c) {x = a;y = b;z = c;}point operator -(const point &b)const {     //返回减去后的新点return point(x - b.x, y - b.y,z-b.z);}point operator +(const point &b)const {     //返回加上后的新点return point(x + b.x, y + b.y,z+b.z);}//数乘计算point operator *(const double &k)const {    //返回相乘后的新点return point(x * k, y * k,z*k);}point operator /(const double &k)const {    //返回相除后的新点return point(x / k, y / k,z/k);}double operator *(const point &b)const {    //点乘return x*b.x + y*b.y+z*b.z;}
}point;
double dist(point p1, point p2) {       //返回平面上两点距离return sqrt((p1 - p2)*(p1 - p2));
}
typedef struct sphere {//球double r;point centre;
}sphere;
double SphereInterVS(sphere a, sphere b) {double d = dist(a.centre, b.centre);//球心距double t = (d*d + a.r*a.r - b.r*b.r) / (2.0 * d);//double h = sqrt((a.r*a.r) - (t*t)) * 2;//h1=h2,球冠的高double angle_a = 2 * acos((a.r*a.r + d*d - b.r*b.r) / (2.0 * a.r*d));  //余弦公式计算r1对应圆心角,弧度double angle_b = 2 * acos((b.r*b.r + d*d - a.r*a.r) / (2.0 * b.r*d));  //余弦公式计算r2对应圆心角,弧度double l1 = ((a.r*a.r - b.r*b.r) / d + d) / 2;double l2 = d - l1;double x1 = a.r - l1, x2 = b.r - l2;//分别为两个球缺的高度double v1 = PI*x1*x1*(a.r - x1 / 3);//相交部分r1圆所对应的球缺部分体积double v2 = PI*x2*x2*(b.r - x2 / 3);//相交部分r2圆所对应的球缺部分体积double v = v1 + v2;//相交部分体积return v;
}
//
sphere roll[maxn],clean;
int main()
{int cnt=1;int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%lf%lf%lf%lf",&roll[i].centre.x,&roll[i].centre.y,&roll[i].centre.z,&roll[i].r);}scanf("%lf%lf%lf%lf",&clean.centre.x,&clean.centre.y,&clean.centre.z,&clean.r);double v=0;//相离;for(int i=0;i<n;i++){if(dist(roll[i].centre,clean.centre)>=(roll[i].r+clean.r))continue;else if(dist(roll[i].centre,clean.centre)+roll[i].r<=clean.r){v+=(4.0/3.0)*PI*roll[i].r*roll[i].r*roll[i].r;}else{v+=SphereInterVS(roll[i], clean);}}printf("Case #%d: %.20lf\n",cnt++,v);}
}

 

  相关解决方案