省赛训练之基础(一)

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

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、从右到左找到没有递增的数据,确定位置 p
		for(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");
	}
}


省赛基础~嘿嘿~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值