计概杂烩2017

2017计概期末

探险家丁丁

#include <stdio.h>

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

int main(void) { 
    double f;scanf("%lf",&f);
    printf("%.5lf",5.0*(f-32)/9);
	return 0;
}

摘礼物

#include <stdio.h>

int a[2000];

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

计算菌落面积

#include <stdio.h>

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

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

相交的圆

#include <stdio.h>

int x[2000],y[2000],r[2000];

int main(void) { 
    int n;scanf("%d",&n);
    for(int i=1;i<=n;++i)   scanf("%d%d%d",&x[i],&y[i],&r[i]);
    for(int i=1;i<n;++i)
        for(int j=i+1;j<=n;++j)
            if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])<(r[i]+r[j])*(r[i]+r[j]))
            {
                printf("Yes\n");
                return 0;
            }
    printf("No\n");
	return 0;
}

寻找最长公共前缀

/*code from jxl!!!orz*/
#include <stdio.h>
char a[256],b[256],c[256],d[256];

int main(void) { 
    // scanf("%s%s%s%s",a,b,c,d);
    gets(a);gets(b);gets(c);gets(d);
    int i=0;
    for(int j=0;j<255;++j){
        if(a[i]==b[i]){
            i++;
        }
        else{
            b[i]='\0';
            i=0;
            break;
        }
    }
    for(int j=0;j<255;++j){
        if(c[i]==b[i]){
            i++;
        }
        else{
            c[i]='\0';
            i=0;
            break;
        }
    }
    for(int j=0;j<255;++j){
        if(d[i]==c[i]){
            i++;
        }
        else{
            d[i]='\0';
            i=0;
            break;
        }
    }
	puts(d);
	return 0;
}

dalaojxl的代码,思想是两两比较找公共部分

特殊数之和

#include <stdio.h>

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

考察知识点:如何取一个数的第k位(使用/和%)

谁是冠军

#include <stdio.h>

int a[200][10];

int main(void) { 
    int n,maxi,maxsum=0;scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        int maxx=0,minx=100,sum=0;
        for(int j=1;j<=5;++j)
        {
            scanf("%d",&a[i][j]);
            if(maxx<a[i][j]) maxx=a[i][j];
            if(minx>a[i][j]) minx=a[i][j];
            sum+=a[i][j];
        }
        if(maxsum<sum-minx-maxx) maxsum=sum-minx-maxx,maxi=i;
    }
    printf("%d %d\n",maxi,maxsum);
	return 0;
}

按题目要求记录和比较即可,细节比较多,写的时候多注意

趣味游戏大赛

#include <stdio.h>

int a[20],b[20],a1,b1;

int main(void) { 
    for(int i=1;i<=10;++i)
    {
        int x;scanf("%d",&x);
        if(x%2) a[++a1]=x;
        else b[++b1]=x;
    }
    for(int i=1;i<a1;++i)
        for(int j=i+1;j<=a1;++j)
            if(a[i]<a[j])
            {int tmp=a[i];a[i]=a[j];a[j]=tmp;}
    for(int i=1;i<b1;++i)
        for(int j=i+1;j<=b1;++j)
            if(b[i]>b[j])
            {int tmp=b[i];b[i]=b[j];b[j]=tmp;}
    for(int i=1;i<a1;++i) printf("%d ",a[i]);
    if(a1&&b1) printf("%d ",a[a1]);
    else if(a1) printf("%d\n",a[a1]);
    for(int i=1;i<b1;++i) printf("%d ",b[i]);
    if(b1) printf("%d\n",b[b1]);
	return 0;
}

注意一些特殊情况的判断

购买礼物

#include <stdio.h>

int a[2000],b[2000];

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

排序

字符统计

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

int b[400];
char c[400];

int main(void) { 
	int n;scanf("%d\n",&n);
	for(int i=1;i<=n;++i)
	{
	    for(int j=0;j<=200;++j) c[j]='\0';
	    gets(c);int l=strlen(c);
	    for(int j=0;j<l;++j)
	    {
	        if(c[j]!=' '){
	            ++b[c[j]-'a'];
	        }
	    }
	    for(int j=0;j<=24;++j)
	    {
	        printf("%d ",b[j]);
	        b[j]=0;
	    }
	    printf("%d\n",b[25]);b[25]=0;
	}
	return 0;
}

建议使用gets读入,注意回车的过滤。(第8行)

最佳凑单

#include <stdio.h>

int n,t,cnt=1,ans,minx=1000000000;
int a[100];

int main(void) { 
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;++i,cnt*=2) scanf("%d",&a[i]);
	for(int i=0;i<cnt;++i)
	{
	    int i1=i;ans=0;
	    for(int j=1;j<=n;++j)
	    {
	        ans+=a[j]*(i1%2);
	        i1/=2;
	    }
	    if(ans>=t&&minx>ans) minx=ans;
	}
	if(minx==1000000000) printf("0\n");
	else printf("%d\n",minx);
	return 0;
}

方法一递归:每次选一件商品,然后递归将问题转化成已经解决的问题,就不放代码了(因为我没写

方法二状态压缩:考虑到每种物品都只有买或不买两种选择,我们用一个n位二进制数来储存n件商品购买时所有可能的情况,去最后一位(1或0)直接%2即可,代码见上

posted @ 2023-12-15 16:20  hcx1999  阅读(35)  评论(0)    收藏  举报