zoukankan      html  css  js  c++  java
  • 洛谷学习

    P5708 三角形面积

    这道题有个注意点是关于变量类型的选择,如果选择的是float类型,答案将是错误的,double类型才是正确的。因为double类型float类型更加精确。如图:

    可以看到float类型的值为1333.320068,而double类型的值为1333.320002。代码如下:

    #include<stdio.h>
    #include<math.h>
    
    int main(void){
        float a,b,c;
        float p;
        float area;
        scanf("%f %f %f",&a,&b,&c);
        P=(A+B+c)/2;
        area=sqrt(p*(p-a)*(p-b)*(p-c));
        printf("%0.1f",area);
    }
    

    P5709 Apples Prologue

    这道题应该关注m,t,s为0的情况时的讨论,还有关于吃完所有苹果花的时间是否比过去的时间要长。

    #include<stdio.h>
    
    int main(void){
        int m,t,s;
        int r_apple,e_apple;
        scanf("%d %d %d",&m,&t,&s);
        if(m==0||m*t<s){
            printf("0");
            return 0;
        }
        if(s==0){
            printf("%d",m);
        }else{
            if(t==0){
                printf("0");
            }else{
                e_apple=s/t;
                if(e_apple*t<s){
                    e_apple+=1;
                }
                r_apple=m-e_apple;
                printf("%d",r_apple);
            }
        }
    }
    

    P2181对角线

    这题说任意三条对角线都不会交于一点,所以过一个交点的就只有两条对角线,而两条对角线已经确定了四个点,就相当于这道题是排列组合题,从n个点中选出四个点。还有一个问题是这题的n取值非常大,必须由unsigned long long来定义变量。

    #include<stdio.h>
    
    int main(void){
        unsigned long long n;
        unsigned long long dot;
        scanf("%llu",&n);
        if(n<=3){
            printf("0");
        }else{
            dot=n*(n-1)/2*(n-2)/3*(n-3)/4;
            printf("%llu
    ",dot);
        }
        return 0;
    }
    

    P5710 数的性质

    分情况讨论即可

    #include<stdio.h>
    
    int main(void){
        int num;
        scanf("%d",&num);
        if(num%2==0&&num>4&&num<=12){
            printf("1 ");
        }else{
            printf("0 ");
        }
    
        if(num%2==0||(num>4&&num<=12)){
            printf("1 ");
        }else{
            printf("0 ");
        }
    
        if(num%2==0&&(num<=4||num>12)){
            printf("1 ");
        }else if(num%2!=0&&(num>4&&num<=12)){
            printf("1 ");
        }else{
            printf("0 ");
        }
    
        if(num%2!=0&&(num<=4||num>12)){
            printf("1");
        }else{
            printf("0");
        }
    }
    

    P5711 闰年判断

    普通闰年:年份能被4整除,但是不能被100整除。
    世纪闰年:年份能被400整除。

    #include<stdio.h>
    
    int main(void){
        int year;
        scanf("%d",&year);
        if((year%4==0&&year%100!=0)||year%400==0){
            printf("1");
        }else{
            printf("0");
        }
    }
    

    P5712 Apples

    分情况讨论即可

    #include<stdio.h>
    
    int main(void){
        int x;
        scanf("%d",&x);
        if(x==0){
            printf("Today, I ate 0 apple.");
        }else if(x==1){
            printf("Today, I ate 1 apple.");
        }else{
            printf("Today, I ate %d apples.",x);
        }   
    }
    

    P5713 洛谷团队系统

    分情况讨论

    #include<stdio.h>
    
    int main(void){
        int n;
        int LocalTime,LuoguTime;
        scanf("%d",&n);
        LocalTime=n*5;
        LuoguTime=11+n*3;
        if(LocalTime<LuoguTime){
            printf("Local");
        }else{
            printf("Luogu");
        }
        
    }
    

    P5714 肥胖问题

    这道题用c++会方便很多

    #include<iostream>
    using namespace std;
    
    int main(void){
        float m,h;
        float BMI;
        cin>>m>>h;
        BMI=m/h*h;
        if(BMI<18.5){
            cout<<"Underweight";
        }else if(BMI<24&&BMI>=18.5){
            cout<<"Normal";
        }else{
            cout<<BMI<<endl;
            cout<<"Overweight";
        }
        
    }
    

    P5715 三位数排序

    我用的是冒泡排序:

    #include<stdio.h>
    
    int main(void){
        int num[3];
        int temp,i,j;
        for(i=0;i<3;i++){
            scanf("%d",&num[i]);
        }
        
        for(i=0;i<2;i++){
            for(j=i;j<3;j++){
                if(num[i]>num[j]){
                    temp=num[i];
                    num[i]=num[j];
                    num[j]=temp;
                }
            }
        }
        printf("%d %d %d",num[0],num[1],num[2]);
    }
    

    P5716 月份天数

    分类讨论

    #include<stdio.h>
    
    int main(void){
        int year,month;
        scanf("%d %d",&year,&month);
        if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
            printf("31");
        }else if(month==4||month==6||month==9||month==11){
            printf("30");
        }else{
            if((year%4==0&&year%100!=0)||year%400==0){
                printf("29");
            }else{
                printf("28");
            }
        }
        
    }
    

    P1888 三角函数

    我这里先使用了冒泡排序,再使用了辗转相除法。

    #include<stdio.h>
    
    int main(void){
        unsigned long long num[3],temp;
        int i,j,n=1,a,b;
        scanf("%llu %llu %llu",&num[0],&num[1],&num[2]);
        for(i=0;i<2;i++){
            for(j=i;j<3;j++){
                if(num[i]>num[j]){
                    temp=num[i];
                    num[i]=num[j];
                    num[j]=temp;
                }
            }
        } 
    
        b=num[2];
        a=num[0];
        while (n){
            n=b%a;
            b=a;
            a=n;
        }
        printf("%llu/%llu",num[0]/b,num[2]/b);
    }
    

    P5717 三角形分类

    分情况讨论

    #include<stdio.h>
    
    int main(void){
        int num[3];
        int i,j,temp;
        scanf("%d %d %d",&num[0],&num[1],&num[2]);
    
        for(i=0;i<2;i++){
            for(j=i;j<3;j++){
                if(num[i]>num[j]){
                    temp=num[i];
                    num[i]=num[j];
                    num[j]=temp;
                }
            }
        }
    
        if(num[0]+num[1]<=num[2]){
            printf("Not triangle");
            return 0;
        }
        if(num[0]*num[0]+num[1]*num[1]==num[2]*num[2]){
            printf("Right triangle
    ");
        }
        if(num[0]*num[0]+num[1]*num[1]>num[2]*num[2]){
            printf("Acute triangle
    ");
        }
        if(num[0]*num[0]+num[1]*num[1]<num[2]*num[2]){
            printf("Obtuse triangle
    ");
        }
        if(num[0]==num[1]||num[1]==num[2]){
            printf("Isosceles triangle
    ");
        }
        if(num[0]==num[1]&&num[1]==num[2]){
            printf("Equilateral triangle");
        }
        
    }
    

    P1909 买铅笔

    分类讨论不同铅笔数目的总价格

    #include<stdio.h>
    
    int main(void){
        int n,i,min;
        int amount[4],price[4],money[4];
        scanf("%d",&n);
        for(i=0;i<3;i++){
            scanf("%d %d",&amount[i],&price[i]);
            if(n%amount[i]==0){
                money[i]=n/amount[i]*price[i];
            }else{
                money[i]=(n/amount[i]+1)*price[i];
            }
        }
        min=money[0];
        for(i=0;i<3;i++){
            if(min>money[i]){
                min=money[i];
            }
        }
        printf("%d",min);
    }
    

    P4414 ABC

    判断ABC的顺序

    #include<stdio.h>
    
    int main(void){
        int num[4],i,j,temp;
        char str[4];
        for(i=0;i<3;i++){
            scanf("%d",&num[i]);
        }
        for(i=0;i<2;i++){
            for(j=i;j<3;j++){
                if(num[i]>num[j]){
                    temp=num[i];
                    num[i]=num[j];
                    num[j]=temp;
                }
            }
        }
        scanf("%s",str);
        for(i=0;i<3;i++){
            if(str[i]=='A') printf("%d ",num[0]);
            if(str[i]=='B') printf("%d ",num[1]);
            if(str[i]=='C') printf("%d ",num[2]);
        }
    }
    

    P5718 找最小值

    定义一个最小值min,然后与每次输入的值进行比较,找出最小值。

    #include<stdio.h>
    
    int main(void){
        int n,a,min=1000;
        scanf("%d",&n);
        while (n--){
            scanf("%d",&a);
            if(a<min){
                min=a;
            }
        }
        printf("%d",min);
    }
    

    P5719 分类平均

    循环一下就行

    #include<stdio.h>
    
    int main(void){
        int i;
        int n,k,count=0;
        double sum1=0,sum2=0;
        scanf("%d %d",&n,&k);
        for(i=1;i<=n;i++){
            if(i%k==0){
                sum1+=i;
                count+=1;
            }else{
                sum2+=i;
            }
        }
        printf("%.1lf %.1lf",sum1/count,sum2/(n-count));
    }
    

    P5720 一尺之棰

    循环直到1

    #include<stdio.h>
    
    int main(void){
        int a,day=1;
        scanf("%d",&a);
        while (a!=1){
            day++;
            a=a/2;
        }
        printf("%d",day);
    }
    

    P5721 数字直角三角形

    两层循环解决

    #include<stdio.h>
    
    int main(void){
        int n,j,i,num=1;
        int floor;
        scanf("%d",&n);
        floor=n;
        for(j=floor;j>0;j--){
            for(i=0;i<floor;i++){
                if(num<10){
                    printf("0%d",num++);
                }else{
                    printf("%d",num++);
                }
            }
            floor--;
            printf("
    ");
        }
    }
    

    P1009 阶乘之和

    这个涉及到了高精算法

    #include<stdio.h> 
    #include<string.h> 
    int src[1001],v[1001],src_l=1,v_l=1;
    void add(){
        int i=0,x=0;
        while(i<=src_l||i<=v_l){
            i++;
            src[i]+=x+v[i];
            x=src[i]/10;
            src[i]%=10;
        }
        if(x)src[++i]=x;
        if(i>src_l)src_l=i;
    }
    void mut(int arg){
        int i=1,x=0;
        while(i<=v_l){
            v[i]=v[i]*arg+x;
            x=v[i]/10;
            v[i]%=10;
            i++;
        }
        while(x){
            v[++v_l]=x%10;
            x/=10;
        }
    }
    int main(){
        int i,n;
        scanf("%d",&n);
        memset(src,0,sizeof(src));
        memset(v,0,sizeof(v));
        src[1]=v[1]=1;
        for(i=2;i<=n;i++){
            mut(i);
            add();
        }
        while(src[src_l]==0)src_l--;
        for(i=src_l;i>=1;i--)
           printf("%d",src[i]);
        return 0;
    }
    

    P5722 数列求和

    #include<stdio.h>
    
    int main(void){
        int n,sum=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            sum+=i;
        }
        printf("%d",sum);
    }
    

    P5721 质数口袋

    写个子函数判断是否为质数

    #include<stdio.h>
    int prime(int n);
    
    int main(void){
        int L,i,sum=0,count=0;
        scanf("%d",&L);
        for(i=2;;i++){
            if(prime(i)){
                if(sum+i>L){
                    break;
                }
                sum+=i;
                count++;
                printf("%d
    ",i);
            }
        }
        printf("%d",count);
    }
    
    int prime(int n){
        int i;
        for(i=2;i*i<=n;i++){
            if(n%i==0){
               return 0;
            }
        }
        return 1;
    }
    

    P2669 金币

    挺简单的

    #include<stdio.h>
    
    int main(void){
        int k,i,days=0,sum=0;
        scanf("%d",&k);
        for(i=1;;i++){
            if (days+i>k){
                sum+=(k-days)*i;
                break;
            }
            sum+=i*i;
            days+=i;
        }
        printf("%d",sum);
    }
    

    P1217 回文质数

    通过埃文斯筛选法+回文数判断

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    int IsPrime(int x);
    int IsPlaindrome(int x);
    int prime[10000001];
    
    int main(void){
        int a,b,len;
        scanf("%d %d",&a,&b);
        if(b>10000000) b=9999999;
        IsPrime(b);
        if(a%2==0) a++;
        for(int i=a;i<=b;i+=2){
            if(prime[i]&&IsPlaindrome(i)){
                printf("%d
    ",i);
            }
        }
    }
    
    int IsPrime(int x){
        int n;
        memset(prime,1,sizeof(prime));
        prime[1]=0;
        n=sqrt(x);
        for(int i=2;i<=n;i++){
            if(prime[i]){
                for(int j=2;j*i<=x;j++){
                    prime[i*j]=0;
                }
            }
        }
    }
    
    int IsPlaindrome(int x){
        int temp=x,ans=0;
        while(temp){
            ans=temp%10+ans*10;
            temp=temp/10;
        }
        if(ans==x) return 1;
        else return 0;
    }
    

    数字反转

    判断两种情况,一种是负数,另一种是尾部由多个0的情况。

    #include<stdio.h>
    #include<string.h>
    
    int main(void){
        char N[11];
        int len,i,flag=0;
        scanf("%s",N);
        if(N[0]!='-'){
            len=strlen(N);
            for(i=len-1;i>=0;i--){
                if(N[i]!='0'||flag!=0){
                    printf("%c",N[i]);
                    flag=1;
                }
            }
        }else{
            len=strlen(N);
            printf("-");
            for(i=len-1;i>=1;i--){
                if(N[i]!='0'||flag!=0){
                    printf("%c",N[i]);
                    flag=1;
                }
            }
        }
        
    
    }
    

    P1720 月落乌啼算钱

    找到规律即可

    #include<stdio.h>
    
    int main(void){
        int n,i;
        double ans[50];
        scanf("%d",&n);
        ans[1]=ans[2]=1.00;
        for(i=3;i<=n;i++){
            ans[i]=ans[i-1]+ans[i-2];
        }
        printf("%.2lf",ans[n]);
    }   
    

    P5724 求极差

    找出最大最小值

    #include<stdio.h>
    
    int main(void){
        int i,n,a[101],min=1000,max=0;
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d",&a[i]);
            if(min>a[i]){
                min=a[i];
            }
            if(max<a[i]){
                max=a[i];
            }
        }
        printf("%d",max-min);
    }   
    

    P1420 最长连号

    一开始理解错了题目意思,害。找出连续数的长度,然后赋值给max,再找下一个连续数的长度,比较长度大小。

    #include<stdio.h>
    
    int main(void){
        int n,i,len=1,max=0;
        int num[10001];
        scanf("%d",&n);
        scanf("%d",&num[0]);
        for(i=1;i<n;i++){
            scanf("%d",&num[i]);
            if(num[i]>num[i-1]&&num[i]-num[i-1]==1){
                len++;
            }else{
                if(max<len){
                    max=len;
                }
                len=1;
            }
        }
        printf("%d",max);
    }   
    

    P1075 质因数分解

    找出一个质数,能不能整除n,如果能得到的商是否是质数。

    #include<stdio.h>
    int IsPrime(int x);
    
    int main(void){
        int n,i,j,ans;
        scanf("%d",&n);
        for(i=2;i*i<=n;i++){
            if(!IsPrime(i)) continue;
            if(n%i==0){
                ans=n/i;
                if(IsPrime(ans)){
                    printf("%d",ans);
                }
                
            }
        }
    }   
    
    int IsPrime(int x){
        int i;
        if(x==2||x==3) return 1;
        for(i=2;i*i<=x;i++){
            if(x%i==0){
                return 0;
            }
        }
        return 1;
    }
    

    P5725 求三角形

    简单题

    #include<stdio.h>
    
    int main(void){
        int n,i,j,k=1;
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                if(k<10){
                    printf("0%d",k++);
                }else{
                    printf("%d",k++);
                }
            }
            printf("
    ");
        }
    
        k=1;
        printf("
    ");
    
        for(i=1;i<=n;i++){
            for(int l=1;l<=n-i;l++){
                printf("  ");
            }
            for(j=1;j<=i;j++){
                if(k<10){
                    printf("0%d",k++);
                }else{
                    printf("%d",k++);
                }
            }
            printf("
    ");
        }
        
    }   
    

    P5726 打分

    找出最大最小值减去后取平均值

    #include<stdio.h>
    
    int main(void){
        int n,i,min=10,max=0;
        int score[1001];
        double ans=0;
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            scanf("%d",&score[i]);
            if(score[i]>max){
                max=score[i];
            }
            if(score[i]<min){
                min=score[i];
            }
            ans+=score[i];
        }
        printf("%.2lf",(ans-min-max)/(n-2));
    }   
    

    P4956 Davor

    我做的很复杂,看了一下别人貌似比较简单。我这里主要是先判断能否被52整除,然后进行枚举x和k。如果不能,再进行三重循环进行判断。

    #include<stdio.h>
    
    int main(void){
        int n,i,j,k,week;
        scanf("%d",&n);
        if(n%52==0){
            week=n/52;
            for(i=1;;i++){
                for(j=1;j<=100;j++){
                    if(j*7+i*21==week){
                        printf("%d
    %d",j,i);
                        return 0;
                    }
                }
            }
        }
    
        week=n/51;
        for(i=1;;i++){
            for(j=1;j<=100;j++){
                for(k=1;k<=6;k++){
                    if((j*7+i*21)*51+j*k+(k*k-k)/2==n){
                        printf("%d
    %d",j,i);
                    }
                }
            }
        }
    
    }   
    
  • 相关阅读:
    【DFS】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem D. Divisibility Game
    【二分】【三分】【计算几何】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem L. Lines and Polygon
    【线段树】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem J. Jedi Training
    【贪心】【后缀自动机】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem E. Enter the Word
    【转载】随机生成k个范围为1-n的随机数,其中有多少个不同的随机数?
    【推导】【贪心】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem H. Path or Coloring
    【枚举】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem D. Cutting Potatoes
    【找规律】【递归】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem F. Doubling
    【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!
    【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle
  • 原文地址:https://www.cnblogs.com/zesiar0/p/13339986.html
Copyright © 2011-2022 走看看