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;
    }
    

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

  • 相关阅读:
    Elasticsearch 入门教程
    Spring Boot集成JasperReports生成PDF文档
    Java程序员须知的七个日志管理工具
    vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
    spring boot项目在外部tomcat环境下部署
    linux 如何正确的关闭mongodb
    Centos7下yum安装配置nginx与php
    Centos7 搭建lnmp环境 (centos7+nginx+MySQL5.7.9+PHP7)
    CentOS7安装MySQL
    搭建MySQL高可用负载均衡集群(转)
  • 原文地址:https://www.cnblogs.com/doubeecat/p/solution-cf1156a.html
Copyright © 2011-2022 走看看