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); } }
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 }
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 */