Camp 的题是真的难,还好没去,不然要被血虐。
做了Day2的几道题。
这个挺简单的,就是范围炸了long long ,暴力枚举两个数就行了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
题意:删除两个数,最后连起来的数字结果最大。
这题暴力过了,实际上暴力是过不了,本来要预处理一下,删除一个长度为 L的数字串,第一个不同的数字的位置,
比如:12 55 58
删除第二个 字符串的时候, 会变成 1258,和原字符串 125558 字符是 5 和8 不同(这个地方只是举例说明删一个字符串)
但是出题人好像没有特意卡,就直接暴力过了
#include
using namespace std;
typedef long long LL;
//#define debug(x) cout<<"["<c[pos2][j]) {
return 0;
}
i++;
j++;
if(i==b[pos]) {
pos++;
i=0;
}
if(j==b[pos2]) {
pos2++;
j=0;
}
if(pos2==n)return 1;
}
}
bool pd2(int pos) {
int pos2=pos+1,i=0,j=0;
while(1) {
if(pos==a1)pos++;
if(pos2==a1)pos2++;
if(c[pos][i]c[pos2][j]) {
return 0;
}
i++;
j++;
if(i==b[pos]) {
pos++;
i=0;
}
if(j==b[pos2]) {
pos2++;
j=0;
}
if(pos2==n)return 1;
}
}
int main() {
scanf("%d",&t);
int cas=1;
while(t--) {
scanf("%d",&n);
mi=100;
for(int i=0; i=0; i--) {
if(b[i]==mi) {
a1=i;
break;
}
}
}
mi=100;
a2=-1;
for(int i=0; i=0; i--) {
if(i==a1)continue;
if(b[i]==mi) {
a2=i;
break;
}
}
}
printf("Case #%d: ",cas++);
for(int i=0; i
题意:问删除的球和原来给的这些球相交的体积有多少。
贴个求球相交的体积板子就行了0.0.
#include
#include
#include
#include
#define CLR(a,b) memset(a,b,sizeof(a));
using namespace std;
const double PI = acos(-1);
const int maxn= 105;
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;
sphere s,a[maxn];
void SphereInterVS(sphere a, sphere b,double &v,double &s) {
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圆所对应的球缺部分体积
v = v1 + v2;//相交部分体积
double s1 = PI*a.r*x1; //r1对应球冠表面积
double s2 = PI*a.r*x2; //r2对应球冠表面积
s = 4 * PI*(a.r*a.r + b.r*b.r) - s1 - s2;//剩余部分表面积
}
int t, n;
double x, y, z, r;
int cas = 1;
int main() {
cin >> t;
while(t--) {
cin >> n;
for(int i = 1; i <= n; i++) {
scanf("%lf%lf%lf%lf",&x,&y,&z,&a[i].r); //其他球
a[i].centre = {x,y,z};
}
scanf("%lf%lf%lf%lf",&x,&y,&z,&r);
s.r = r;
s.centre = {x,y,z}; //中心球
double ans = 0, v = 0;
for(int i = 1; i <= n; i++) {
double ss, dis = dist(s.centre, a[i].centre);
if(dis >= s.r + a[i].r)continue; //在外部
if(dis + min(s.r, a[i].r) <= max(s.r, a[i].r)) { //在内部
ans += 4.0 / 3.0 * PI * min(s.r,a[i].r) * min(s.r,a[i].r) * min(s.r,a[i].r);
continue;
}
SphereInterVS(s, a[i], v, ss); //相交部分
ans += v;
}
printf("Case #%d: %.14f\n",cas++,ans);
}
}
//搜索板子,搜到的一名大佬的,我改都没改就直接过了0.0
预处理出所有分组情况,一共是 C(3,12)*C(3,9)*C(3,6) /24种。 15400种
让后暴力求解 15400*6000竟然判断过了0.0
题目没说要怎么输出答案,然后我用SET 错了,用vector 过了。。。。。。
#include
using namespace std;
typedef long long LL;
#define debug(x) cout<<"["<i)continue; //这个是去重的,会有重复的情况
for(int i2=i+1; i2<12; i2++) {
if(u[i2])continue;
for(int i3=i2+1; i3<12; i3++) {
if(u[i3])continue;
dat.x[p][0]=i;
dat.x[p][1]=i2;
dat.x[p][2]=i3;
u[i]=u[i2]=u[i3]=1;
dfs(p+1);
u[i]=u[i2]=u[i3]=0;
}
}
}
}
int t,cas=1;
int main() {
dfs(0);
debug(k);
scanf("%d",&t);
while(t--) {
for(int i=0; i<12; i++)
scanf("%d",&a[i]);
int num=0,ans;
for(int i=0;im3&&m2+m3>m1&&m3+m1>m2)tnum++;
}
if(tnum>num) {
num=tnum;
ans=i;
}
if(num==4)break;
}
printf("Case #%d: %d\n",cas++,num);
if(num==0)continue;
for(int j=0; j<4; j++) {
int m1=a[pa[ans].x[j][0]],m2=a[pa[ans].x[j][1]],m3=a[pa[ans].x[j][2]];
if(m1+m2>m3&&m2+m3>m1&&m3+m1>m2){
printf("%d %d %d\n",m1,m2,m3);
}
}
}
return 0;
}