小小白(上)

 ̄綄美尐妖づ 提交于 2020-01-19 19:05:39

今天,小白参加了小白月赛,然后发现,自己连做小白的资格都没有(嘤嘤嘤),从此自封为小小白
真是得自我反省(10-1)道题啊!!!!!
下面请看那些“刀”是如何将小小白的心割成碎片的~~~~

Audio

(某位大佬的代码,膜拜膜拜)

#include<bits/stdc++.h>
using namespace std;
int main()
{
   int x1,y1,x2,y2,x3,y3;
   scanf("%d %d",&x1,&y1);//输入已知的三个点
   scanf("%d %d",&x2,&y2);
   scanf("%d %d",&x3,&y3);
   double  k2=-1.0*(x2-x1)/(y2-y1);//找出两条中垂线的斜率
   double k3=-1.0*(x3-x1)/(y3-y1);
   double  ctx2=(x1+x2)*1.0/2,cty2=(y1+y2)*1.0/2;//求出中点
   double  ctx3=(x1+x3)*1.0/2,cty3=(y1+y3)*1.0/2;
   double   x=(cty3-cty2+k2*ctx2-k3*ctx3)/(k2-k3);//方程联立,求出交点坐标
   double  y=k2*(x-ctx2)+cty2;
   printf("%.3f %.3f",x,y);
    return 0;
}

看到上面的代码,反思一下,感觉这就是一道初中数学题,画个图就解决了
再来看看我的wa

#include <bits/stdc++.h>

using namespace std;
void juli(int x1,int y1,int x2,int y2,int x3,int y3)
{
    double x0,y0;
    for(x0=0,y0=0; x0<=1e9,y0<=1e9;)
    {
        double d1=pow(x1-x0,2),d3=pow(x2-x0,2),d5=pow(x3-x0,2);
        double d2=pow(y1-y0,2),d4=pow(y2-y0,2),d6=pow(y3-x0,2);
        double d=pow(d1+d2,0.5),d0=pow(d3+d4,0.5),d8=pow(d5+d6,0.5);
        if(d==d0&&d0==d8&&d==d8) printf("%.3f %.3f",x0,y0);
    }
}
int main()
{
    int x1,x2,x3,y1,y2,y3;
    scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);
    juli(x1,y1,x2,y2,x3,y3);
    return 0;
}

这个代码没有输出,我觉得是在实数范围内找不到x0,y0,因为实数有无限个,所以for循环的最后一部分根本写不出来

Channels

(大佬代码,被我稍加修改)主体思路是两个时间节点都和起始时刻1比,然后作差,这个真的比我那个方法要快!算法优化果然是硬伤

#include<bits/stdc++.h>
using namespace std;  
int main()
{
    long long int t1,t2,x1,y1,x2,y2,ans,x,t,ans1,ans2;
    while(cin>>t1>>t2)//输入起始时刻
    {
        t1-=1;//只有最开始将t1后退一位,在最后作差的时候才能把t1算上
        x1=t1/60;//ti中含有完整的节目+广告的时刻
        y1=t1%60;//为了下面与50作比较,判断t1是否落在广告时间段
        x2=t2/60;//与t1类似
        y2=t2%60;
        x=x2-x1;//这步很迷,我觉得没啥用,应该可以去掉
        ans1=x1*50;//完整节目的时刻数
        if(y1>50)//如果落在广告时刻段
            ans1+=50;
        else //如果是节目时刻段
            ans1+=y1;
        ans2=x2*50;
        if(y2>50)
            ans2+=50;
        else
            ans2+=y2;
        ans=ans2-ans1;//作差
        cout<<ans<<endl;
    }
    return 0;

下面是我RE的代码(虽然我觉得想的也挺好的)

#include <bits/stdc++.h>

using namespace std;

int main()
{   long long int n,t1,t2,sum;
    long long int flag[100000];
    scanf("%lld%lld",&t1,&t2);    
    sum=0;
    for(long long int i=t1;i<=t2;i++)
    {flag[i]=1;
        if((i/10)%6==1) flag[i]=0;
        sum=sum+flag[i];
    }
    printf("%lld\n",sum);
    return 0;
}

Exams

#include <bits/stdc++.h>
using namespace std;
 
double A[5000];
int B[5000];
int main(){
    double ans = 0;
    double sum = 0;
    int n;
    int op;
    int len = 0;
    double a,b,c,d,e,f,g;
    cin >> n;
    for(int i = 0;i < n;i++){
        cin >> op >> a >> b >> c >> d >> e >> f >> g;
        if(op == 2) continue;
        sum += a;
        A[len] = a;//len每次循环+1
        B[len++] = b*c+d*e+f*g+0.5;//四舍五入到整数????
    }
 
    for(int i = 0;i < len;i++){
        ans += A[i]*1.0/sum*B[i];//打破整除
    }
    printf("%.2f\n",ans);//四舍五入保留两位
    return 0;
    }

发现新大陆:转义字符可以自动四舍五入保留到要求的位数,如果不想四舍五入,可以使用floor函数(向下取整)

#include <bits/stdc++.h>
using namespace std;
int main()
{   double a;
    while(~scanf("%lf",&a))
    printf("%.2f\n",floor(a*100)/100);
    return 0;
}

但是至于上面的int数组B+0.5就四舍五入了?这段我没想明白,于是自创一段四舍五入

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int x;
    double sum;
    scanf("%lf",&sum);
    x=sum*10;//对和进行四舍五入,保留到整数
    if(x%10>=6&&x%10<=9) sum=x/10+1;
    if(x%10>=0&&x%10<=4) sum=x/10;
    printf("%.0f\n",sum);
    return 0;
}

我是用结构体写的,但是不知哪里错了,希望有好心的大佬帮我改一下٩(๑òωó๑)۶(点开那个题目链接就能看到啦!)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!