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