CCPC-Wannafly Winter Camp Day2 (Div2)

目录

A  Erase Numbers II

B Erase Numbers I

H Cosmic Cleaner


A  Erase Numbers II

CCPC-Wannafly Winter Camp Day2 (Div2)_第1张图片

CCPC-Wannafly Winter Camp Day2 (Div2)_第2张图片

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

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

【代码】

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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(len1s2)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>a[i];
		string l=a[0],r=a[1];
		string f1,f2,f3;
		for(int i=2;i

B Erase Numbers I

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

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

【代码】

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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(l1s2)return 1;
    else return 0;
}
int findlen()
{
    int len=0x3f3f3f3f;
    //printf("%d\n",len);
    for(int i=0;i>a[i];
        }
        int len=findlen();
        for(int i=0;ia[pos1] && flag)break;
                else if(!flag || a[i]a[pos1] && flag==1)break;
                else flag=0;
            }
            else pos1=i;
        }
        //printf("pos1=%d\n",pos1);
        len=findlen();
        for(int i=0;ia[pos2] && flag)break;
                    else if(!flag || 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

 

H Cosmic Cleaner

CCPC-Wannafly Winter Camp Day2 (Div2)_第3张图片

CCPC-Wannafly Winter Camp Day2 (Div2)_第4张图片

CCPC-Wannafly Winter Camp Day2 (Div2)_第5张图片

【分析】弱弱地说一句...套的板子...  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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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=(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);
    }
}

 

你可能感兴趣的:(Comet,OJ)