GOC国赛特训及答案

2356两个八分音符

image-20240623173955916

1
2
3
4
5
6
7
8
int main(){
p.c(0);
p.oo(20);
p.rt(90).fd(20).lt(90).size(4).fd(100);
p.rt(70).size(10).fd(100).rt(110).size(4).fd(100);
p.rt(90).fd(20).oo(20);
return 0;
}

2357变化的正三角形

image-20240628153145817

1
2
3
4
5
6
7
8
9
10
int main(){
for(int i=0;i<5;i++){
p.lt(30);
for(int j=0;j<4;j++){
p.fd(100-10*i).rt(120);
}
p.fd(50-5*i).lt(60+10*i);
}
return 0;
}

2358偶数车辆和

image-20240623174050751

image-20240623174057642

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(){
int n,a[10],sum;
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
}
for(int i=0;i<n;i++){
p.moveTo(40*i,a[i]/2.0);
if(a[i] % 2==0){
sum += a[i]*20;
p.rr(20,a[i],1);
}else{
p.rr(20,a[i],0);
}
}
//红面积 sum
//长(2*n-1)*20=40n-20
p.moveTo(20*n-20,-1*sum/(80*n-40));
p.rr(40*n-20,sum/(40*n-20),3);
return 0;
}

2359矩形外框A

image-20240628153308344

image-20240628153357201

image-20240628153409419

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
int myMax(int a,int b){
if(a>b) return a;
else return b;
}
int main(){
int a[4],X,Y,max,res;
for(int i=0;i<4;i++){
cin >> a[i];
if(max<a[i]) max=a[i];
}
p.r(100,100).up();
p.moveTo(-50,50);
for(int i=0;i<4;i++){
p.rt(90).o(a[i]);
if(a[i]==max){
X=getX();
Y=getY();
res=i;
}
p.fd(100);
}
if(a[res]>a[(res+1)%4]+100 && a[res]>a[(res+2)%4]+100&&a[res]>a[(res+3)%4]+100){//最大值很大
p.moveTo(X,Y);
p.r(max*2,max*2);
}else{
if(a[(res+1)%4]<a[(res+2)%4] && a[(res+2)%4] > a[(res+3)%4]){//对角线
cout << "对角线";
p.moveTo(X/abs(X)*(50+max-(a[res]+a[(res+2)%4]+100)/2.0),Y/abs(Y)*(50+max-(a[res]+a[(res+2)%4]+100)/2.0));
p.r((a[res]+a[(res+2)%4]+100),(a[res]+a[(res+2)%4]+100));
}else{
//长为长 短为宽
if((res%2==0&&a[(res+1)%4]>a[(res+2)%4] && a[(res+1)%4] > a[(res+3)%4])||(res%2==1&&a[(res+3)%4]>a[(res+1)%4] && a[(res+3)%4] > a[(res+2)%4])){
p.moveTo(X/abs(X)*(50+max-(max+a[(res+1+2*(res%2))%4]+100)/2.0),Y/abs(Y)*(50+max-(max+myMax(a[(res+2-res%2)%4],a[(res+3-res%2)%4])+100)/2.0));
p.r(max+a[(res+1+2*(res%2))%4]+100,max+myMax(a[(res+2-res%2)%4],a[(res+3-res%2)%4])+100);
}else{
//长为宽 短为长
p.moveTo(X/abs(X)*(50+max-(max+myMax(a[(res+1+res%2)%4],a[(res+2+res%2)%4])+100)/2.0),Y/abs(Y)*(50+max-(max+a[(res+3-2*(res%2))%4]+100)/2.0));
p.r(max+myMax(a[(res+1+res%2)%4],a[(res+2+res%2)%4])+100,max+a[(res+3-2*(res%2))%4]+100);
}

}
}
return 0;
}

2360绿色正三角形

image-20240623174108830

1
2
3
4
5
6
7
8
9
10
int main(){
p.c(10).rt(30);
for(int i=0;i<6;i++) {
if(i==3){
p.rt(60).fd(75).lt(120);
}
p.fd(150).rt(120);
}
return 0;
}

2361黑色印记

image-20240628154114419

1
2
3
4
5
6
7
8
9
10
11
int main(){
p.picU(0).up();
p.oo(283,0);
p.rr(400,400,15);
p.rt(45).rr(400,400,15);
for(int i=0;i<8;i++){
p.fd(150).rt(45).rr(90,90,0).lt(45).bk(150);
p.rt(45);
}
return 0;
}

2362挑选日期

image-20240623174130144

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(){
p.rt(90).up();
int a[5];
for(int i=0;i<5;i++){
cin >> a[i];
}
for(int i=0;i<5;i++){
if((a[i]+1)%7==6){
p.oo(20,3);
}else if((a[i]+1)%7==0){
p.oo(20,4);
}else{
p.oo(20,1);
}
p.fd(40);
}
return 0;
}

2363车辆统计

image-20240623175620853

image-20240623175632380

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(){
double avg,sum=0,n,a[10],max=0;
p.hide().speed(9);
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
sum += a[i];
if(max < a[i]) max=a[i];
}
avg = sum / n;
for(int i=0;i<n;i++){
p.moveTo(20*i,0).fd(a[i]);
if(max==a[i]) p.up().fd(20).o(20,1).down();
}
p.moveTo(0,avg).rt(90).c(1).fd(20*n-20);
return 0;
}

2364统计排水量

image-20240628154344906

image-20240628154553404

1
2
3
4
5
6
7
8
9
10
11
12
13
int main(){
double sum=0,n,a[15],max=0;
p.hide().speed(9);
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
if(max < a[i]) max=a[i];
}
for(int i=0;i<n;i++){
p.moveTo(20*i,a[i]/max*150).r(20,a[i]/max*300);
}
return 0;
}

2365矩形外框B

image-20240623180651332

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
int myMax(int a,int b){
if(a>b) return a;
else return b;
}
int main(){
int a[4],X,Y,max,res;
for(int i=0;i<4;i++){
cin >> a[i];
if(max<a[i]) max=a[i];
}
p.r(100,100).up();
p.moveTo(-50,50);
for(int i=0;i<4;i++){
p.rt(90).o(a[i]);
if(a[i]==max){
X=getX();
Y=getY();
res=i;
}
p.fd(100);
}
if(a[res]>a[(res+1)%4]+100 && a[res]>a[(res+2)%4]+100&&a[res]>a[(res+3)%4]+100){//最大值很大
p.moveTo(X,Y);
p.r(max*2,max*2);
}else{
if(a[(res+1)%4]<a[(res+2)%4] && a[(res+2)%4] > a[(res+3)%4]){//对角线
p.moveTo(X/abs(X)*(50+max-(a[res]+a[(res+2)%4]+100)/2.0),Y/abs(Y)*(50+max-(a[res]+a[(res+2)%4]+100)/2.0));
p.r((a[res]+a[(res+2)%4]+100),(a[res]+a[(res+2)%4]+100));
}else{
//长为长 短为宽
if((res%2==0&&a[(res+1)%4]>a[(res+2)%4] && a[(res+1)%4] > a[(res+3)%4])||(res%2==1&&a[(res+3)%4]>a[(res+1)%4] && a[(res+3)%4] > a[(res+2)%4])){
p.moveTo(X/abs(X)*(50+max-(max+a[(res+1+2*(res%2))%4]+100)/2.0),Y/abs(Y)*(50+max-(max+myMax(a[(res+2-res%2)%4],a[(res+3-res%2)%4])+100)/2.0));
p.r(max+a[(res+1+2*(res%2))%4]+100,max+myMax(a[(res+2-res%2)%4],a[(res+3-res%2)%4])+100);
}else{
//长为宽 短为长
p.moveTo(X/abs(X)*(50+max-(max+myMax(a[(res+1+res%2)%4],a[(res+2+res%2)%4])+100)/2.0),Y/abs(Y)*(50+max-(max+a[(res+3-2*(res%2))%4]+100)/2.0));
p.r(max+myMax(a[(res+1+res%2)%4],a[(res+2+res%2)%4])+100,max+a[(res+3-2*(res%2))%4]+100);
}

}
}
return 0;
}

2366彩色花朵

image-20240628155229283

1
2
3
4
5
6
7
8
9
10
11
12
int main(){
p.picU(0); //开启图形按照笔方向画
p.up();
for(int i=0;i<9;i++){
p.fd(130).ee(20,100,13).bk(130).rt(40);
}
p.rt(20);
for(int i=0;i<9;i++){
p.fd(110).ee(30,80,14).bk(110).rt(40);
}
return 0;
}

2367变化的正方形

image-20240628151021609

image-20240628150954532

1
2
3
4
5
6
7
8
9
10
11
int main(){
int n;
cin >> n;
for(int i=0;i<n;i++){
p.c(i);
for(int j=0;j<6;j++){
p.fd(200-20*i).lt(90);
}
}
return 0;
}

2368彩色图形

image-20240628150229616

image-20240628150316832

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(){
p.moveTo(-300,300).up().hide().rt(90);
int n;
cin >> n;
for(int i=0;i<n;i++){
for(int j=i;j<n+i;j++){ // 4 5 6 7 8
if(j>n-1){
p.oo(20,(j-1)%(n-1));
}else{
p.oo(20,j);

}
p.fd(40);
}
p.moveTo(-300,260-40*i);
}
return 0;
}

2369腾图

image-20240623174555103

image-20240628165336683

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(){
p.c(12).speed(9).hide();
int n,a,b,o;
cin >> n;
for(int i=0;i<6;i++){
p.fd(n).rt(60);
}
p.rt(90);
a = 2*sqrt(n*n-(n/2.0)*(n/2.0));
for(int i=0;i<3;i++){
p.fd(a).lt(120);
}
b = a /2.0;
p.fd(b).lt(60);
for(int i=0;i<3;i++){
p.fd(b).rt(30).fd(n/2.0).bk(n/2.0).lt(150);
}
o = b/2.0/sqrt(3);
p.up().fd(b/2.0).lt(90).fd(o).o(o);

return 0;
}

2370变化的立方体

image-20240623175645692

image-20240623175654138

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 函数:计算两个数的最大公约数
int gcd(int a, int b) {
while (b != 0) {
int temp = a % b;
a = b;
b = temp;
}
return a;
}

// 函数:计算三个数的最大公约数
int gcdOfThree(int a, int b, int c) {
// 先计算前两个数的GCD
int gcdAB = gcd(a, b);
// 再用这个结果与第三个数计算GCD
return gcd(gcdAB, c);
}

int main(){
int a[3],b;
p.speed(6);
for(int i=0;i<3;i++){
cin >> a[i];
}
b=gcdOfThree(a[0],a[1],a[2]);
for(int i=0;i<=a[0]/b;i++){
p.moveTo(-b*i,-a[2]);
p.fd(a[2]).rt(45).fd(a[1]).lt(45);
}
p.rt(90);
for(int i=0;i<=a[1]/b;i++){
p.fd(a[0]).rt(90).fd(a[2]);
p.up().bk(a[2]).rt(90).fd(a[0]).lt(45).fd(b).lt(135).down();
}
for(int i=0;i<a[2]/b;i++){
p.moveTo(-a[0],-b*i-b);
p.fd(a[0]).lt(45).fd(a[1]).rt(45);
}
return 0;
}

2371矩形外框C

image-20240628152010556

image-20240628152027315