计概杂烩2022

发布时间 2023-12-16 12:47:46作者: oierwyh

2022期末

直角三角形的面积

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

int main()
{
	int a,b,c;scanf("%d%d%d",&a,&b,&c);
	double p=(a+b+c)/2;
	double s=sqrt(p*(p-a)*(p-b)*(p-c));
	printf("%.2lf\n",s);
	return 0;
}

忘记是直角三角形了(逃

编程语言

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

int v;char a[200];

int main(void) { 
    scanf("%d\n",&v);
    while(1){
        gets(a);
        if(strcmp(a,"0")==0) break;
        if(strcmp(a,"++V")==0||strcmp(a,"V++")==0) v++;
        if(strcmp(a,"--V")==0||strcmp(a,"V--")==0) v--;
    }
    printf("%d\n",v);
	return 0;
}

使用strcmp函数方便的进行字符串比较

涨价的门票

#include <stdio.h>

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

密文破译

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

int main(void) { 
    char a[200];int n;gets(a);scanf("%d",&n);
    for(int i=0;i<strlen(a);++i)
    {
        int x=a[i]-'A';
        x=(x-n+26)%26;
        printf("%c",x+'A');
    }
	return 0;
}

小P考试

#include <stdio.h>

double a[1000];

int main(void) {int t;scanf("%d",&t);
    while(t--){
        int n;scanf("%d",&n);
        for(int i=1;i<=n;++i) scanf("%lf",&a[i]);
        for(int i=1;i<n;++i)
            for(int j=i+1;j<=n;++j)
                if(a[i]>a[j])
                {double tmp=a[i];a[i]=a[j];a[j]=tmp;}
        if(n%2) printf("%.1lf\n",a[n/2+1]);
        else printf("%.1lf\n",1.0*(a[n/2]+a[n/2+1])/2);
    }
	return 0;
}

世界杯赢家

#include <stdio.h>

int a[200000],b;

int main(void) { int n;scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        int x,y;scanf("%d%d",&x,&y);
        if(a[x]!=1) a[x]++;
        a[y]+=2;
    }
    for(int i=1;i<=100000;++i)
    {
        if(a[i]==1)
            if(b) printf(", %d",i);
            else {printf("%d",i);b=1;}
    }
	return 0;
}

善用标注,减小代码复杂度

找出密码

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

char a[20000];

int main(void) { 
    int i=0;char a[200];
    while(scanf("%s",a)!=EOF)
    {
        int l=strlen(a);
        printf("%c",a[i++%l]);
    }
	return 0;
}

这里需要用到scanf的返回值:
(1)如果全部或部分正常输入,scanf返回成功输入的数据的个数
(2)如果检测到结束(即全部没有正常输入)则返回EOF(EOF=-1,是个常数)

这样可以写的简洁一点

请佩戴好口罩

#include <stdio.h>

int a[200][200],b[200][200];
int ans;
int x1[4]={0,0,1,-1};
int y1[4]={1,-1,0,0};

void f(int x,int y)
{
    if(a[x][y])
    {
        b[x][y]=2;
        for(int i=0;i<4;++i)
            if(b[x+x1[i]][y+y1[i]]!=1||a[x+x1[i]][y+y1[i]]==1)
            {b[x][y]=0;break;}
    }
     else
     {
        for(int i=0;i<4;++i)
            if(b[x+x1[i]][y+y1[i]]==1&&a[x+x1[i]][y+y1[i]]==0)
            {b[x][y]=2;break;}
     }
}

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

纯模拟,细节较多,多注意一下即可

叠盘子

#include <stdio.h>

int a[2000],b[2000],f[2000];
int n,ans;

int main(void) { 
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%d%d",&a[i],&b[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;}
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<i;++j)
        {
            if(b[i]>b[j]&&f[i]<f[j]+1)
                f[i]=f[j]+1;
        }
        if(ans<f[i]) ans=f[i];
    }
    printf("%d\n",ans+1);
    return 0;
}

先按照一个数组排序,那么答案就是另一个数组中最长上升子序列的长度,这个比较容易理解(?)

然后就是经典的求最长上升子序列(LIS):使用原始的\(n^2\)解法即可\(f[i]=max\{f[j]\}+1(0<j<i)\)

完结撒花!★,°:.☆( ̄▽ ̄)/$:.°★