D2

Cosmic Cleaner:

为什么大家都知道球缺怎么求,我没听说过啊???

我真的是印象里今天第一次听说球缺这个东西啊。。。

我一看,哇,神仙几何题,毫无头绪,投了投了,然后就被过穿了???

tlsnb!!!

知道了公式以后求一求就阔以了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pi 3.1415926535
int t,n,x[105],y[105],z[105],r[105];
int xx,yy,zz,rr;
double dis(int id){
    return sqrt((x[id]-xx)*(x[id]-xx)+(y[id]-yy)*(y[id]-yy)+(z[id]-zz)*(z[id]-zz));
}
int main(){
    ios::sync_with_stdio(false);
    cin>>t;
    for(int cas=1;cas<=t;cas++){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>x[i]>>y[i]>>z[i]>>r[i];
        }
        cin>>xx>>yy>>zz>>rr;
        double ans = 0;

        for(int i=1;i<=n;i++){
            double len = dis(i);
            if(len+r[i]<=rr){//在内部
                ans+=4.0/3*pi*r[i]*r[i]*r[i];
            } else if(len+r[i]>rr&&len<rr){//一大块在里面
                double h1 = (rr*rr-r[i]*r[i]-len*len)/2/len;
                double h2 = h1+len;
                double v1 = pi/3*(3*r[i]-(r[i]-h1))*(r[i]-h1)*(r[i]-h1);//小的
                double v2 = pi/3*(3*rr-(rr-h2))*(rr-h2)*(rr-h2);//大的
                ans+=4.0/3*pi*r[i]*r[i]*r[i];
                ans-=v1;ans+=v2;
            } else if(len>=rr&&len<=rr+r[i]){
                double k = rr+r[i]-len;
                double h2 = (k*k-2*k*r[i])/(2*k-2*rr-2*r[i]);
                double h1 = k-h2;
                double v1 = pi/3*(3*r[i]-h1)*h1*h1;//小的
                double v2 = pi/3*(3*rr-h2)*(h2)*(h2);//大的
                ans+=v1+v2;
            }
        }
        printf("Case #%d: %.10f
",cas,ans);
    }
}
View Code

B:

官方做法不会,当时听的时候觉得奇难无比,后来大家果然很多贪心的,,。   把操作当成是  两次  删除一个。

考虑删一个  从前向后遍历:如果一个串长度是最短的并且字典序比后面的串小,那肯定删啊留着干啥啊。。。

如果很不幸没有这样的串,然而我们又要保证删的是长度最小的,我们就把最后一个长度最小的删掉好了。

重复两次。搞到T恤了舒服qwq(Day3).

一首 届不到の爱恋 送给大家!!!

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int t,n;
 4 struct Node{
 5     char s[20];
 6     int len;
 7     int flag;
 8 }a[6666];
 9 int main(){//考虑执行两次删除操作
10     //ios::sync_with_stdio(false);
11     cin>>t;
12     for(int cas=1;cas<=t;cas++){
13         cin>>n;
14         for(int i=1;i<=n;i++){
15             cin>>a[i].s;
16             a[i].len = strlen(a[i].s);
17             a[i].flag=0;
18         }
19         int id1=-1,id2=-1;
20         int minn = 0x3f;
21         for(int i=1;i<=n;i++){
22             minn = min(minn,a[i].len);
23         }
24         for(int i=1;i<=n;i++){//如果从前面 有个最短的比后面的字典序小
25             if(minn!=a[i].len)continue;
26             if(i+1<=n){
27                 if(strcmp(a[i].s,a[i+1].s)<0){
28                     id1=i;
29                     a[i].flag=1;
30                     break;
31                 }
32             }
33         }
34         if(id1==-1){//不存在的话就从后向前删最小
35             for(int i=n;i>=1;i--){
36                 if(a[i].len==minn){
37                     a[i].flag=1;
38                     break;
39                 }
40             }
41         }
42         minn = 0x3f;
43         for(int i=1;i<=n;i++) {
44             if(a[i].flag)continue;
45             minn = min(minn, a[i].len);
46         }
47         for(int i=1;i<=n;i++){
48             if(a[i].flag)continue;
49             if(minn == a[i].len){
50                 int j=i+1;
51                 if(a[j].flag) j++;
52                 if(strcmp(a[i].s,a[j].s)<0){
53                     id2=i;
54                     a[i].flag=1;
55                     break;
56                 }
57             }
58         }
59         if(id2==-1){
60             for(int i=n;i>=1;i--){
61                 if(a[i].flag)continue;
62                 if(a[i].len==minn){
63                     a[i].flag=1;
64                     break;
65                 }
66             }
67         }
68         printf("Case #%d: ",cas);
69         for(int i=1;i<=n;i++){
70             if(a[i].flag)continue;
71             cout<<a[i].s;
72         }
73         cout<<endl;
74     }
75 }
View Code

K: 拼木棍

哇不会搜索啊!!!头痛欲裂      拖了一个星期,,今天看了看谈姐姐代码发现非常好懂,其实之前就懂了一直没去想怎么写,不过他那份已经被卡T了,貌似时限短了1000ms,然后我给改成了正解,就是预处理所有排列然后遍历就阔以,,,这么沙雕的题为什么我当时不会呢。。。看来早起果然可以提高人的智商,感觉智商巅峰期就是8:00-10:00了

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 inline int read() {
 4     int X=0,w=1; char c=getchar();
 5     while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
 6     while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
 7     return X*w;
 8 }
 9 int d[1000005][13],tmp[13],tot=0;
10 int c[13];
11 void dfs(int num,int now){
12     int b[15];
13     if(num==3){//
14         tmp[now+1]=c[1];
15         tmp[now+2]=c[2];
16         tmp[now+3]=c[3];
17         tot++;
18         for(int i=1;i<=12;i++){
19             d[tot][i]=tmp[i];
20         }
21         return;
22     }
23     for(int i=1;i<=num;i++) b[i]=c[i];
24     int st;
25     for(int i=2;i<num;i++){
26         for(int j=i+1;j<=num;j++){
27             tmp[now+1]=b[1];
28             tmp[now+2]=b[i];
29             tmp[now+3]=b[j];
30             st=0;
31             for(int k=1;k<=num;k++){
32                 if(k!=1&&k!=j&&k!=i)
33                     c[++st]=b[k];
34             }
35             dfs(num-3,now+3);
36         }
37     }
38 }
39 int t,a[15],f[15][15][15];
40 int main(){
41     for(int i=1;i<=12;i++)c[i]=i;
42     dfs(12,0);
43     t=read();
44     for(int cas=1;cas<=t;cas++){
45         for(int i=1;i<=12;i++)a[i]=read();
46         sort(a+1,a+13);
47         for(int i=1;i<=10;i++){
48             for(int j=i+1;j<=11;j++){
49                 for(int k=j+1;k<=12;k++){
50                     if(a[i]+a[j]>a[k])
51                         f[i][j][k]=1;
52                     else
53                         f[i][j][k]=0;
54                 }
55             }
56         }
57         int ans = 0;
58         vector<int> v;
59         for(int i=1;i<=tot;i++){
60             int num=0;
61             for(int j=1;j<=12;j+=3){
62                 if(f[d[i][j]][d[i][j+1]][d[i][j+2]])
63                     num++;
64             }
65             if(num>ans){
66                 ans=num;
67                 v.clear();
68                 for(int j=1;j<=12;j+=3){
69                     if(f[d[i][j]][d[i][j+1]][d[i][j+2]]) {
70                         v.push_back(d[i][j]);
71                         v.push_back(d[i][j+1]);
72                         v.push_back(d[i][j+2]);
73                     }
74                 }
75             }
76             if(ans==4)
77                 break;
78         }
79         printf("Case #%d: %d
",cas,ans);
80         for(int i=0;i<v.size();i++){
81             if(i%3==2)
82                 printf("%d
",a[v[i]]);
83             else
84                 printf("%d ",a[v[i]]);
85         }
86     }
87 }
88 /**
89 1
90 1 2 3 4 5 6 7 8 9 10 11 12
91  */
View Code
原文地址:https://www.cnblogs.com/MXang/p/10301377.html