计概杂烩2015

2015

两点间距离

#include <stdio.h>
#include<math.h>

double x1,y11,z1,x2,y2,z2;

int main(void) { 
	scanf("%lf,%lf,%lf\n%lf,%lf,%lf",&x1,&y11,&z1,&x2,&y2,&z2);
	double squ=(x1-x2)*(x1-x2)+(y11-y2)*(y11-y2)+(z1-z2)*(z1-z2);
	double ans=sqrt((x1-x2)*(x1-x2)+(y11-y2)*(y11-y2)+(z1-z2)*(z1-z2));
	printf("%.2lf\n",ans);
	return 0;
}

选美比赛

#include <stdio.h>

/* C语言初始模板程序 */

int main(void) { 
	char c;int x,b;scanf("%c%d",&c,&x);
	if(c=='M') b=x>100?1:0;
	else b=x>80?1:0;
	if(b) printf("Beauty\n");
	else printf("Not beauty\n");
	return 0;
}

正整数的约数数目

#include <stdio.h>

/* C语言初始模板程序 */

int main(void) { 
	int n,ans=0;scanf("%d",&n);
	for(int i=1;i<=n;++i)  
	    if(n%i==0) ++ans;
	printf("%d\n",ans);
	return 0;
}

级数求和

#include <stdio.h>

int main(void) { 
	double cnt=0;
	int n,i=1;scanf("%d",&n);
	while(cnt<=n)
	{
	    cnt+=1.0/i++;
//	    printf("%.2lf\n",cnt);
	}
	printf("%d\n",i-1);
	return 0;
}

这里注意精度,用1.0而不是1

正整数的最大公约数和最小公倍数

#include <stdio.h>

int n,a[100],gcd=1,lcm=1,maxx=1;

int main(void) { 
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
	    scanf("%d",&a[i]);
	    maxx*=a[i];
	}
	for(int i=1;i<=a[1];++i)
	{
	    int b=0;
	    for(int j=1;j<=n;++j)
	        if(a[j]%i)
	        {
	            b=1;break;
	        }
	    if(b==0) gcd=i;
	}
	for(int i=a[n];i<=maxx;++i)
	{
	    int b=0;
	    for(int j=1;j<=n;++j)
	    {
	        if(i%a[j])
	        {
	            b=1;break;
	        }
	    }
	    if(b==0)
	    {
	        lcm=i;
	        break;
	    }
	}
	printf("%d %d\n",gcd,lcm);
	return 0;
}

直接枚举并判断即可

颜值测试

#include <stdio.h>

int a[200][200],b[200][200];

int main(void) { 
	int n,m;scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	    for(int j=1;j<=m;++j)
	        scanf("%d",&a[i][j]);
	for(int i=1;i<=n;++i)
	    for(int j=1;j<=m;++j)
	        scanf("%d",&b[i][j]);
	for(int i=1;i<=n;++i,printf("\n"))
	    for(int j=1;j<=m;++j)
	        if(j==m)
	            printf("%d",a[i][j]-b[i][j]);
    	    else
	            printf("%d ",a[i][j]-b[i][j]);
	return 0;
}

IBM编码

#include <stdio.h>
#include<string.h>

char a[100];

int main(void) { 
	int n;scanf("%d\n",&n);
	while(n--)
	{
	    gets(a);int l=strlen(a);
	    for(int i=0;i<l;++i)
	    {
	        if((a[i]>='A'&&a[i]<='Z')||(a[i]>='a'&&a[i]<='z'))
	        {
	            a[i]++;
	            if(a[i]=='Z'+1||a[i]=='z'+1)
	                a[i]-=26;
	        }
	    }
	    puts(a);
	}
	return 0;
}

表示大整数

#include <stdio.h>
#include <string.h>

int n,k;
char a[100][100];

int main(void) { 
	scanf("%d\n",&n);
	while(n--)
	{
	    scanf("%s",a[n]);int l=strlen(a[n]);
	    scanf(" %d\n",&k);
	    if(a[0]=='-') printf("-");
	    for(int i=0;i<l;++i)
	    {
	        if(a[i]=='-') continue;
	        if((l-i-1)%k==0&&a[n][i]!='-'&&i!=l-1)
	            printf("%c,",a[n][i]);
	        else printf("%c",a[n][i]);
	    }
	    printf("\n");
	}
	return 0;
}

注意负数要往前移一个

医院排号

#include <stdio.h>

int t,n,k;
int a[2000],b[2000];

int main(void) { 
	scanf("%d",&t);
	while(t--)
	{
	    scanf("%d%d",&n,&k);
	    for(int i=1;i<=n;++i) {scanf("%d",&a[i]);b[i]=i;}
	    for(int i=1;i<n;++i)
	        for(int j=i+1;j<=n;++j)
	            if(a[i]<a[j]||(a[i]==a[j]&&b[i]>b[j]))
	            {
	                int tmp=a[i];a[i]=a[j];a[j]=tmp;
	                tmp=b[i];b[i]=b[j];b[j]=tmp;
	            }
	    k=k<n?k:n;printf("%d\n",k);
	    for(int i=1;i<=k;++i)
	        if(i==k)
	            printf("%d",b[i]);
	        else printf("%d ",b[i]);
	   printf("\n");
	}
	return 0;
}

铺地板

#include <stdio.h>
#include <string.h>

int a[200][200];
int n;

int f(int x)
{
	return x<1||x>n;
}

int main(void) { 
	scanf("%d",&n);
	int x1=-1,y1=1,x=1,y=1;
	for(int i=1;i<=n*n;++i)
	{
		a[x][y]=i;
		if(f(x+x1)&&f(y+y1))
		{
			if(x+x1==0) {x++;x1=-x1;y1=-y1;}
			if(y+y1==0) {y++;x1=-x1;y1=-y1;}
		}
		else if(f(x+x1)) {y++;x1=-x1;y1=-y1;}
		else if(f(y+y1)) {x++;x1=-x1;y1=-y1;}
		else {x+=x1;y+=y1;}
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(j!=n) printf("%d ",a[i][j]);
			else printf("%d\n",a[i][j]);
	return 0;
}

找规律填数即可,这里f函数是算某个坐标是否出界的。
注意前半个三角形和后面半个中间规律可能发生了变化,判断一下即可。

整数删除若干数字后的最小数

#include <stdio.h>
#include <string.h>
char a[200],q[200];
int k,m,cnt;

int main(void) { 
	scanf("%s",a);scanf("%d",&k);
	int l=strlen(a),l1=0,l2=l-k;
	q[0]=a[0];
	for(int i=1;i<l;++i)
	{
//	    if(k==0) break;
	    if(cnt==-1) q[++cnt]=a[i];
	    else if(q[cnt]>a[i]&&k!=0)
	    {
	        --k;--cnt;--i;
	    }
	    else
	    {
	        q[++cnt]=a[i];
	    }
	}
	while(q[l1]=='0') ++l1;
	for(int i=l1;i<l2;++i) printf("%c",q[i]);
	if(l1>=l2) printf("0\n");
	return 0;
}

思路:整一个单调队列,如果队尾元素比当前元素更大就出队然后当前元素跟新的队尾元素比较,如果队尾元素小于等于当前元素就入队,知道出队数达到k为止,如果全部入队还有没用完的k,就从队尾扣除,详见代码
(连载中。。。。。。

posted @ 2023-12-15 15:29  hcx1999  阅读(12)  评论(0编辑  收藏  举报