省赛训练之基础(一)

来源:互联网 发布:awesome note for mac 编辑:程序博客网 时间:2024/05/22 05:01

今天老师讲了几道比较基础的题目:

1、北大平台的1552 -->Doubles

思路:找到数据中刚好为其中1倍的数字。前一个与后面的依次比对。

做法:

#include<stdio.h>int main(){ intn,a[1000],i,j,k,count,z; while(scanf("%d",&n)){ if(n==-1)  break; z=1; a[0] = n;//别忘记了我们的第一个数据 while(scanf("%d",&n)!=EOF){   a[z++] = n;   if(n==0)    break;  }  count = 0; for(i=0;i<z;i++)  for(j=i+1;j<z;j++){   if(a[i]*2==a[j]||a[j]*2==a[i]){     count++;    }   }  printf("%d\n",count);  }}



2、北大平台上的2739-->Sum of Consecutive Prime Numbers

思路:1、通过打表的方式写出连续的素数。 2、连续的最大素数不超过我们输入的素数。

做法:

#include<stdio.h>

#include<string.h>

int main(){

        inta,i,z,j,k,b[10005],s,count;

        memset(b,0,sizeof(b));

        z=0;

        //先打表

        for(i=2;i<10000;i++)

        {

               for(j=2;j<i;j++)

                       if(i%j==0)

                               break;

                       if(i==j)

                               b[z++]=i;

        }

//      for(i=0;i<10;i++)

//             printf("%d",b[i]);

        while(scanf("%d",&a)!=EOF){

               if(a==0)

                       break;

               s =0;

               i=0;

               j=i;

               count=0;

               while(1){

                       //开始计算

                       while(s<a){

                               s= s + b[i];

                               i++;

                       }

                       if(s==a){

                               count++;

                               if(b[i+1]>s)

                                      break;

                               else

                               {

                                      j++;

                                      i= j;

                                      s= 0;

                               }

                       }

                       else{

                               j++;

                               if(b[j]<=a)

                               {

                                      i=j;

                                      s= 0;

                               }

                               else

                                      break;

                       }

               }

               printf("%d\n",count);

        }

}

3、北大平台上的2242

思路:这题主要是要求圆的半径

方法:1、中垂线求半径 2、a/sinA = b/sinB =2R &S =1/2bcsinA

#include<stdio.h>

#include<math.h>

int main()

{

        doublex1,y1,x2,y2,x3,y3,a,b,c,p,s,Sin,d;

        while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF)

        {

               a =sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));

               b =sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));

               c =sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));

        //      printf("%lf  %lf %lf\n",a,b,c);

               p =(a+b+c)/2.0;

        //      printf("%lf",p);

               s =sqrt(p*(p-a)*(p-b)*(p-c));

        //      printf("%lf\n",s);

               d =b*c*a/(2*s);

               printf("%.2lf\n",d*3.141592653589793);

        }

}


4、北大平台1833

       思路:字典序的求法:1、记录从右到左第一次出现非递增数字的位置【num[b]<=num[b+1]】。2、向后比,找到比这个数字更大的最小数值,调换位置。3、排序

        方法:

       

#include<stdio.h>#include<string.h>int main(){int T,max,num[2000],i,j,k,n,m,p,q,temp,time,flag;scanf("%d",&T);while(T--){max = 0;scanf("%d%d",&n,&time);for(i=0;i<n;i++)scanf("%d",&num[i]);while(time--){flag = 1;//1、从右到左找到没有递增的数据,确定位置 pfor(i=n-2;i>=0;i--){if(num[i]<num[i+1]){//printf("%d  %d\n",num[i],num[i+1]);flag = 0;p=i;break;}}if(flag==1){for(i=0;i<n;i++)num[i] = i+1;//printf("ok\n");}else{//printf("%d\n",p);//printf("%d\n",num[p]);max = num[p+1];//printf("11111111\n");k = p+1;//2、找到比这个位置上的数更大的最小数for(i=k;i<n;i++){//printf("num[i] = %d  num[p] = %d  max = %d",num[i],num[p],max);if(num[i]<max&&num[i]>num[p]){max = num[i];k = i;}//printf("11111111111111\n");}        //3、交换temp = num[p];num[p] = num[k];    num[k] = temp;//4、排序for(i=p+1;i<n;i++){for(j=i+1;j<n;j++){if(num[j]<num[i]){temp = num[j];num[j] = num[i];num[i] = temp;}}}}} for(i=0;i<n;i++)printf("%d ",num[i]);printf("\n");}}


省赛基础~嘿嘿~

原创粉丝点击