zoukankan      html  css  js  c++  java
  • 题解 CF1156A 【Inscribed Figures】

    这题看上去第一反应:

    什么?平面几何???说好的A题呢???

    读完样例&打完草稿:

    这不就是个xx题

    回到正文,这题需要我们处理三种图形的嵌套:

    1. 圆形
    2. 等腰三角形(底边等于高)
    3. 正方形

    这些嵌套其实总共只有六种情况,我们分类讨论(因为文中提到不会有一样的图形嵌套):

    1. 圆形
      (1).圆形套三角形
      圆形套三角形
      如图,这种情况的三角形三个顶点和圆相交,对答案的贡献为3
      (2).圆形套正方形
      圆形套正方形
      如图,这种情况的正方形四个顶点和圆相交,对答案的贡献为4

    2. 三角形
      (1).三角形套正方形
      三角形套正方形
      如图,这种情况的正方形会与三角形底边重合,所以有无限多个点
      (2).三角形套圆形
      三角形套圆形
      如图,这种情况的圆形会与三角形的三边相交,对答案的贡献(点数)为3

    3. 正方形
      (1).正方形套圆形
      正方形套圆形
      如图,这种情况的圆与正方形四边相交,对答案的贡献为4
      (2).正方形套三角形
      正方形套三角形
      如图,这种情况的正方形会与三角形底边重合,所以有无限多个点
      这样我们就可以写出一份看似正常的代码了:

    #include <cstdio>
    #include <cctype>
    #define MAXN 101
    
    inline int read() {
        int a = 0,f = 1;
        char v= getchar();
        while (!isdigit(v)) {
            if (v == '-') {
                f = -1;
            }
            v = getchar();
        }
        while (isdigit(v)) {
            a = a * 10 + v- 48;
            v = getchar();
        }
        return a * f;
    }
    
    int pre[MAXN],ans;
    
    int main() {
        int n = read();
        for (int i = 1;i <= n;++i) {
            pre[i] = read();
        }
        for (int i = 2;i <= n;++i) {
            if (pre[i-1] == 1) {
                if (pre[i] == 2) {
                    ans += 3;
                }
                else {
                    ans += 4;
                }
            }
    
            if (pre[i-1] == 2) {
                if (pre[i] == 1) {
                    ans += 3;
                }
                else {
                    printf("Infinite");
                    return 0;
                }
            }
    
            if (pre[i-1] == 3) {
                if (pre[i] == 1) {
                    ans += 4;
                }
                else {
                    printf("Infinite");
                    return 0;
                }
            }
        }
        printf("Finite
    %d",ans);
        return 0;
    }
    

    笔者考试时,开开心心的拿着这份代码去交了,结果是:
    WA!
    为什么?
    这里有一组数据可以hack掉这份代码:

    Input:
    3
    3 1 2
    Output:
    Finite
    6
    程序输出:
    Finite
    7
    

    为什么?
    我们可以画个图
    实例
    很明显,在计算圆形跟正方形,三角形与圆形的时候,A点被计算了两遍,这就是问题所在!
    所以,我们要对所有形如这类的数据进行特判
    加上特判的代码:

    #include <cstdio>
    #include <cctype>
    #include <cstdlib>
    #define MAXN 101
    
    inline int read() {
        int a = 0,f = 1;
        char v= getchar();
        while (!isdigit(v)) {
            if (v == '-') {
                f = -1;
            }
            v = getchar();
        }
        while (isdigit(v)) {
            a = a * 10 + v- 48;
            v = getchar();
        }
        return a * f;
    }
    
    int pre[MAXN],ans;
    
    int main() {
        int n = read();
        for (int i = 1;i <= n;++i) {
            pre[i] = read();
        }
        for (int i = 2;i <= n;++i) {
            if (pre[i-2] == 3 && pre[i-1] == 1 && pre[i] == 2) {
            	ans -= 1;
    		}
    		
    		if (pre[i-1] == 1) {
    			if (pre[i] == 2) {
    				ans += 3;
    			}
    			else {
    				ans += 4;
    			}
    		}
    		
    		if (pre[i-1] == 2) {
    			if (pre[i] == 1) {
    				ans += 3;
    			}
    			else {
    				printf("Infinite");
    				return 0;
    			}
    		}
    		
    		if (pre[i-1] == 3) {
    			if (pre[i] == 1) {
    				ans += 4;
    			}
    			else {
    				printf("Infinite");
    				return 0;
    			}
    		}
        }
        printf("Finite
    %d",ans);
        return 0;
    }
    

    使用这份代码,你就可以快乐上分了

  • 相关阅读:
    window.open的火狐、谷歌兼容写法
    一个分数怎样约分?想知道的速度了。。。
    这是第二道题内容要求写一个银行的ATM系统 这个浪费了好长时间 ,遇到了许多问题,不过都解决了,上程序
    两个有理数相加(要求输入时以分数形式,输出时也以分数形式)
    linux centos 7.5下 源码编译安装 lua环境
    SecureCRT 6.7 vim高亮
    C#第一章笔记
    HTML5考试错题
    第九章博客
    第八章博客
  • 原文地址:https://www.cnblogs.com/doubeecat/p/solution-cf1156a.html
Copyright © 2011-2022 走看看