level 0 热身赛的签到题
基本上只要不看错题或者不马虎就不可能做错。
#include<bits/stdc++.h> using namespace std; int main(){ string s; cin>>s; cout<<s<<"saikou"; }
level 2 爱心
这里先检讨一下,赛前没有预估Java语言的System.out.print的时间,导致O(n^2)输出无法通过。本题的时限已经延长到c/c++ 2s,其他语言4s。
这道题如果采用字符二维数组、赋值后输出则有可能输出多余的空格。正确算法是观察爱心的形状,每行输出对应的字符'*'和空格就可以了。
#include<bits/stdc++.h> using namespace std; int main(){ cout<<"I love U forever.\n"; int n,i,j; cin>>n; for(i=0;i<n;i++){ for(j=0;j<n-i;j++)putchar(' '); for(j=0;j<n+2*i;j++)putchar('*'); for(j=0;j<n-i-1;j++)putchar(' '); putchar(' '); for(j=0;j<n-i-1;j++)putchar(' '); for(j=0;j<n+2*i;j++)putchar('*'); cout<<endl; } int temp=0; for(i=6*n-1;i>0;i-=2){ for(j=0;j<temp;j++)putchar(' '); for(j=0;j<i;j++)putchar('*'); cout<<endl; temp++; } }
level 5 太阳花田
这是今年上半年校赛的一道题,当时的通过率也非常惨:
(比赛只有4个人过A题)
这道题的思路如下:
首先题目里没有说长和宽的大小关系,所以不妨设长大于宽。
根据矩形长和宽、以及圆的直径的关系分类讨论即可。
显然圆心和矩形重心重合即可。
一共四种情况:
①,最大重合面积为矩形。
②,最大重合面积为圆抠掉4个弓形
③,最大重合面积为圆抠掉2个弓形
④,最大重合面积为圆形。
弓形的面积可以用一个扇形减去等腰三角形求出。
依次计算输出即可。
#include<bits/stdc++.h> using namespace std; const double pi=3.1415926536; int main(){ double x,y,r; cin>>x>>y>>r; x/=2,y/=2; if(x>y)swap(x,y); double ma=(sqrt(x*x+y*y)); if(r>=ma)printf("%.2lf",4*x*y); else if(r<=x)printf("%.2lf",pi*r*r); else if(r<=y){ double h=sqrt(r*r-x*x); printf("%.2lf",2*asin(x/r)*r*r+2*h*x); } else{ double h1=sqrt(r*r-x*x),h2=sqrt(r*r-y*y); printf("%.2lf",(2*pi-4*acos(x/r)-4*acos(y/r))*r*r/2+2*h1*x+2*h2*x); } }