• ZOJ Monthly, November 2014


    做了一次月赛,没想到这么难,加上后来补上的题目也只有3个题。第一名也只有4个题啊啊啊啊~.其中两道还是水题。留坑慢慢补上来。

     3832 Tilt Cylinder

                                  

    给定如图所示有盖圆柱体,R,H,水面高度h,倾角a,求水得体积。

    分析:明显的数值积分题,这样考虑。圆下底面即A点与地面高度lim1, 圆上底面一点B与地面高度lim2,h所处的范围进行讨论从而确定积分几何体的两边的高度。我们积分的几何体应该是一个圆柱体被削掉一部分了。

    h>lim1时,几何体左半部分可以减掉一个圆柱,对剩下部分积分,剩下部分左边截面的高度2*R;否则高度为2*R/cos(a);

    h>lim2时,几何体右半部分截面的高度需要计算,为(h-lim2)/cos(a);否则为0.

    注意:这里所说的结合体截面的高度是相对与下面的母线而言,并不是对地高度。

    然后对上面给出的高度范围结合夹角a进行积分,需要推导截面的面积。最后答案需要加上截掉的那部分完整的圆柱体体积(如果是那种情况的话)。

    代码:

      1 #include <bits/stdc++.h>
      2 #define pb push_back
      3 #define mp make_pair
      4 #define esp 1e-12
      5 #define lowbit(x) ((x)&(-x))
      6 #define lson   l, m, rt<<1
      7 #define rson   m+1, r, rt<<1|1
      8 #define sz(x) ((int)((x).size()))
      9 #define pb push_back
     10 #define pf(x) ((x)*(x))
     11 
     12 #define pi acos(-1.0)
     13 
     14 #define in freopen("solve_in.txt", "r", stdin);
     15 #define out freopen("solve_out.txt", "w", stdout);
     16 
     17 #define bug(x) printf("Line : %u >>>>>>
    ", (x));
     18 #define inf 0x0f0f0f0f
     19 using namespace std;
     20 
     21 
     22 int dblcmp(double x) {
     23     if(fabs(x) < esp) return 0;
     24     return x > 0 ? 1 : -1;
     25 }
     26 const int N = 200;
     27 double R, H, a, h;
     28 double f1(double x) {
     29     double cth = (R-x)/R;
     30     return acos(cth)*pf(R)-(R-x)*sqrt(pf(R)-pf(R-x));
     31 }
     32 double f2(double x) {
     33     double cth = (x-R)/R;
     34     return (pi-acos(cth))*pf(R)+(x-R)*sqrt(pf(R)-pf(x-R));
     35 }
     36 double s1(double l, double r) {
     37     double x = 0, y = (l-r)/tan(a);
     38     double h0 = (y-x)/N;
     39 
     40     double res = 0.0;
     41     res = f1(l)+f1(r);
     42     for(int i = 1; i <= N; i++) {
     43         if(i < N)
     44             res += 2*f1(l-(x+i*h0)*tan(a));
     45         res += 4*f1(l-(x+(2*i-1)*h0/2)*tan(a));
     46     }
     47     return res*h0/6;
     48 
     49 }
     50 double s2(double l, double r) {
     51     double x = 0, y = (l-r)/tan(a);
     52     double h0 = (y-x)/N;
     53 
     54     double res = 0.0;
     55     res = f2(l)+f2(r);
     56     for(int i = 1; i <= N; i++) {
     57         if(i < N)
     58             res += 2*f2(l-(x+i*h0)*tan(a));
     59         res += 4*f2(l-(x+(2*i-1)*h0/2)*tan(a));
     60     }
     61     return res*h0/6;
     62 }
     63 
     64 double getAns(double h0, double h1) {
     65     if(h1 > R) {
     66         return s2(h0, h1);
     67     } else if(h0 < R) {
     68         return s1(h0, h1);
     69     } else {
     70         return s2(h0, R)+s1(R, h1);
     71     }
     72 }
     73 int main() {
     74     
     75     while(scanf("%lf%lf%lf%lf", &R, &H, &h, &a) == 4) {
     76         double res = 0.0;
     77         if(fabs(a) > esp && fabs(a-90.0) > esp) {
     78             a = a*pi/180.0;
     79             double lim2 = sin(a)*H;
     80             double lim1 = 2*R*cos(a);
     81 
     82             double h1, h2;
     83             if(h > lim1) {
     84                 h1 = 2*R;
     85                 res += pi*pf(R)*(h/sin(a)-2*R/tan(a));
     86             } else {
     87                 h1 = h/cos(a);
     88             }
     89             if(h > lim2) {
     90                 h2 = (h-lim2)/cos(a);
     91             } else {
     92                 h2 = 0.0;
     93             }
     94             res += getAns(h1, h2);
     95 
     96         } else {
     97             if(fabs(a) < esp) {
     98                 double Sr;
     99                 if(h > R){
    100                     Sr = f2(h);
    101                 }else{
    102                     Sr = f1(h);
    103                 }
    104                 res = Sr*H;
    105             } else {
    106                 res = pi*pf(R)*h;
    107             }
    108         }
    109         printf("%.12f
    ", res);
    110     }
    111     return 0;
    112 }
    View Code

    3839 Poker Face

    分析:第n个是将第n/2个倒插进去然后加上眼睛等部分。

    代码:

     1 #include <bits/stdc++.h>
     2 #define pb push_back
     3 #define mp make_pair
     4 #define esp 1e-8
     5 #define lowbit(x) ((x)&(-x))
     6 #define lson   l, m, rt<<1
     7 #define rson   m+1, r, rt<<1|1
     8 #define sz(x) ((int)((x).size()))
     9 #define pb push_back
    10 #define in freopen("solve_in.txt", "r", stdin);
    11 #define out freopen("solve_out.txt", "w", stdout);
    12 
    13 #define bug(x) printf("Line : %u >>>>>>
    ", (x));
    14 #define inf 0x0f0f0f0f
    15 #define Fill(x, b1, b2, l, r) {
    16     for(int i = 0; i < l; i++)
    17         maze[x][i+b1][b2] = maze[x][i+b1][b2+r-1] = '*';
    18     for(int i = 0; i < r; i++)
    19         maze[x][b1][i+b2] = maze[x][b1+l-1][i+b2] = '*';
    20 }
    21 
    22 using namespace std;
    23 typedef long long LL;
    24 typedef pair<int, int> PII;
    25 typedef map<string, int> MPS;
    26 
    27 using namespace std;
    28 const int maxn = 1100;
    29 char s[maxn][maxn] = {
    30         {"********"}, {"***  ***"}, {"***  ***"}, {"***  ***"}, {"* **** *"}, {"* *  * *"},
    31         {"* *  * *"}, {"********"}
    32     };
    33 
    34 char maze[12][maxn][maxn];
    35 
    36 int popcount(int x){
    37     int ans = 0;
    38     while(1){
    39         if(x&1) break;
    40         ans++;
    41         x >>= 1;
    42     }
    43     return ans;
    44 }
    45 void dfs(int n){
    46     if(n <= 8) return;
    47     int x = popcount(n);
    48 //    cout << x << endl;
    49     for(int i = 0; i < n; i++) for(int j = 0; j < n; j++)
    50         maze[x][i][j] = ' ';
    51     Fill(x, 0, 0, n, n)
    52     int st1 = n/8, st2 = st1+n/2;
    53     Fill(x,  n/8, st1, n/4+1, n/4)
    54     Fill(x, n/8, st2, n/4+1, n/4)
    55     dfs(n>>1);
    56     int b1 = n/2, b2 = n/4;
    57     int nn = n>>1;
    58     for(int i = 0; i < (n>>1); i++)
    59     for(int j = 0; j < (n>>1); j++){
    60         maze[x][b1+i][b2+j] = maze[x-1][nn-1-i][nn-1-j];
    61     }
    62 }
    63 int main() {
    64     
    65     int n;
    66     for(int i = 0; i < 8; i++)
    67         strcpy(maze[3][i], s[i]);
    68     dfs(1024);
    69 
    70     while(scanf("%d", &n), n >= 8) {
    71 //            cout << n <<endl;
    72         int x = popcount(n);
    73 //        cout << x << endl;
    74         for(int i = 0; i < n; i++)
    75             puts(maze[x][i]);
    76         puts("");
    77     }
    78     return 0;
    79 }
    View Code

    3838 Infusion Altar

    分析:对每个点和其对称点访问一遍,将数目最多的那种保留,其他全部替换成这种。

    代码:

     1 #include <bits/stdc++.h>
     2 #define pb push_back
     3 #define mp make_pair
     4 #define esp 1e-8
     5 #define lowbit(x) ((x)&(-x))
     6 #define lson   l, m, rt<<1
     7 #define rson   m+1, r, rt<<1|1
     8 #define sz(x) ((int)((x).size()))
     9 #define pb push_back
    10 #define in freopen("solve_in.txt", "r", stdin);
    11 #define out freopen("solve_out.txt", "w", stdout);
    12 
    13 #define bug(x) printf("Line : %u >>>>>>
    ", (x));
    14 #define inf 0x0f0f0f0f
    15 using namespace std;
    16 const int maxn = 110;
    17 char maze[maxn][maxn];
    18 int vis[maxn][maxn];
    19 vector<char> tmp;
    20 int n;
    21 
    22 void dfs(int x, int y){
    23     if(vis[x][y]) return;
    24     vis[x][y] = 1;
    25     tmp.pb(maze[x][y]);
    26     dfs(y, x);
    27     dfs(n-1-y, n-1-x);
    28     dfs(n-1-x, y);
    29     dfs(x, n-1-y);
    30 }
    31 int main(){
    32 
    33     int T;
    34     for(int t = scanf("%d", &T); t <= T; t++){
    35         scanf("%d", &n);
    36         int ans = 0;
    37         for(int i = 0; i < n; i++)
    38             scanf("%s", maze[i]);
    39 //        for(int i = 0; i < n; i++)
    40 //            cout << maze[i];
    41         memset(vis, 0, sizeof vis);
    42         for(int i = 0; i < n; i++)for(int j = 0; j < n; j++){
    43             if(vis[i][j]) continue;
    44             tmp.clear();
    45             dfs(i, j);
    46             sort(tmp.begin(), tmp.end());
    47             int jj;
    48             int mx = 0;
    49             for(int ii = 0; ii < sz(tmp); ii = jj){
    50                 int ok = 0;
    51                 for(jj = ii; jj < sz(tmp) && tmp[jj] == tmp[ii]; jj++)
    52                     ok++;
    53                 mx = max(ok, mx);
    54             }
    55             ans += sz(tmp)-mx;
    56         }
    57         cout << ans << endl;
    58     }
    59     return 0;
    60 }
    View Code
  • 相关阅读:
    线段树区间异或--差分时间复杂度优化
    数独
    sql语句-根据动态参数去拼sql
    Python-读取文件的大小
    Docker-教你如何通过 Docker 快速搭建各种测试环境
    Docker-本地镜像发布到阿里云
    Docker- Mysql数据库主从同步配置方法
    mysql-如何删除主从同步
    Docker数据卷的介绍和使用
    Docker镜像-拉取并且运行
  • 原文地址:https://www.cnblogs.com/rootial/p/4133562.html
Copyright © 2020-2023  润新知