第1关 - 2020年南海区小学乙组比赛

image.png

5853.四个顶点三角形(程序填空)

题目描述

在四边形的四个顶点上,画完全对称的四个三角形。注:每条边的边长为100。

image.png

题解

int main(){    
    for (int i=0; i<4; i++)  
    {  
        p.fd(100);  
        p.lt(75);  
        for (int j=0; j<3; j++)  
            p.fd(100).rt(120);  
        p.rt(165);   
    }  
    p.hide();  
    return 0;  
}  

5359.彩色虚线

题目描述

用0、1、2号颜色,画下面彩色虚线。线段长度和空的间距长度都是20。

image.png

题解

int main(){  
    p.rt(90);  
    for(int i = 0 ; i < 9; i ++){  
        p.c(i%3).fd(20).up().fd(20).down();  
    }  
      
    return 0;  
}  

5360.齿轮

题目描述

键盘输入一个正整数n,画n个齿的齿轮。内圆半径80,每个齿由边长是20和40的实心矩形构成。例如n=5,画如下图:
image.png

输入格式
一个正整数。

输出格式
画相应的齿轮。

输入/输出例子1

输入:

10

输出:

image.png

int main(){  
    p.o(80);  
    p.up();  
    p.picU(0);  
    int n;  
    cin >> n;  
    for(int i=0;i<n;i++)  
        p.fd(100).rr(20,40).bk(100).rt(360.0/n);  
    return 0;  
}  

5364.包装箱

题目描述
有5个圆形物品自下向上整齐堆放,希望有一个恰好能包住它们的矩形。请用goc画出示意图。例如5个圆的半径分别是30 20 50 40 10,将画出下面图形。

image.png

输入格式
5个正整数,代表从下到上的5个圆的半径。

输出格式
画相应图形。

输入/输出例子1

输入:

30 10 20 50 8

输出:

image.png

题解

int main(){  
      
    int r,n= 5,maxW=0,H=0;  
    cinWin();  
    p.up();  
    while(n--){  
        cin >> r;  
        H += r*2;  
        if(maxW < 2*r) maxW = 2*r;  
        //p.text(maxW);  
        p.fd(r).o(r).fd(r);  
    }  
    p.bk(H /2).down().r(maxW,H);  
      
    return 0;  
}  

5815.最多边的多边形

题目描述

小C在农场看到有n个木条,有各种长度。他想挑出一些长度相等的木条摆放成一个正多半形,不过他希望这个正多边形有尽量多的边。请你帮助小C用goc编程画出示意图。

如n=8,8个木条的长度是:20、130、130、150、20、130、40、100。显然长度130的木条有3根,可以画边长130的正三角形,示意图如下:

image.png

输入格式
第一行1个正整数n,2<=n<=50。
第二行n个正整数(每个数不超过200),表示木条长度。

输出格式
正确的图形。(数据保证只有一个解)

输入/输出例子1

输入:

7

80 200 80 80 200 80 80

输出:

image.png

题解

题目要求边数最多,所以我们可以使用“桶排序” 排序后,求出边数最多的木棍数量与长度。

int arr[205];  
int main(){  
    cinWin();  
    int n,l,maxN=0,maxM = 0;  
    cin >> n;  
    // 循环赋值  
    while(n--){  
        cin >> l;  
        arr[l] ++;  
    }  
    //桶排序  
    for(int i = 1; i<= 200;i++){  
        if(arr[i] > maxN){  
            maxN = arr[i];  
            maxM = i;  
        }  
    }  
    // 画多边形  
    for(int i = 0;i < maxN; i++){  
        p.fd(maxM).rt(360.0/maxN);  
    }  
      
    return 0;  
}  

5816.多层梯形

题目描述

小C在农场的附近看到有n块长度不同的木板从下到上堆在一起,他想用那些长度大于20的木板作为梯形的下低或上底,堆成多个高度相同的等腰梯形,并且总高度是300,中心在同一垂直线上。请用goc编程画出示意图。

例如n=5,5个木板长度分别是200、10、100、150、80。小C去掉长度为10的木板,将从下到上堆成3个等腰梯形。第1个梯形是下底200上底100高100,第2个梯形是下底100上底150高100,第3个梯形是下底150上底80高100。示意图如下:

image.png

输入格式
第一行1个正整数n,2<=n<=50。

第二行n个正整数(不超过500),依次表示从下到上的木板长度,其中至少有2个数大于20。

输出格式
正确的图形。

输入/输出例子1

输入:

7

300 5 80 10 200 80 200

输出:

image.png

注:每个梯形高度是75.

题解

int arr[55];  
int main(){  
    cinWin();  
    int n,cnt = 0,x;  
    cin >> n;  
    // 筛选出符合要求的木板  
    while(n--){  
        cin >> x;  
          
        if(x >20){  
            arr[cnt] = x;  
            cnt ++;  
        }  
    }  
    // cnt 块木板,总高为 300,求每两块木板间的距离  
    int h = 300.0 / (cnt -1);  
    for(int i = 0; i < cnt -1 ;i++){  
        double x1,x2,y1,y2;  
        x1 = arr[i] /2.0;  
        y1 = h*i;  
          
        x2 = arr[i+1] /2.0;  
        y2 = h*(i+1);  
          
        p.moveTo(x1,y1);  
        p.lineTo(-x1,y1);  
        p.lineTo(-x2,y2);  
        p.lineTo(x2,y2);  
        p.lineTo(x1,y1);  
          
    }  
      
    return 0;  
}