ACM基地招新第三次机试标程

1:小曾爱书法(⭐⭐⭐⭐)

(有些同学98分可能就是因为行开头的空格没有忽略掉)

#include<stdio.h>
#include<string.h>
int main(){
    char a[1001][1001],ch;
    int i,j,n,h,l;
    scanf("%d",&n);//n为每列的字符数
    getchar();
    char cc;


    //忽略行开头空格
    while((cc=getchar())==' ');
    h=0;l=0;//h为行,l为列
    h+=l/n;
    l%=n;
    a[h][l++]=cc;


    while((ch=getchar())!='\n'){
        h+=l/n;//当一列满n时行数的字符数加一
        l%=n;//每列的字符数从一到n循环
        a[h][l++]=ch;//将字符存储到二维数组中
    }
    //逆置输出字符
    for(i=0;i<n;i++){  //控制二维数组的行数
        for(j=h;j>=0;j--){//控制二维数组每行的字符数
            if(a[j][i]=='\0')printf(" ");
            else printf("%c",a[j][i]);
           // putchar(a[j][i]?a[j][i]:' ');
        }
        putchar('\n');
    }

}

2:小符正在寻求协助!()

(双重循环遍历每个箱子即可)

#include<stdio.h>
int main()
{
    int a,b,c,u,i,j,k[1100],s[1100]={0},jishu[1100],max=-1;
    scanf("%d",&c);
    for(i=0;i<c;i++)
    {
        scanf("%d",&k[i]);
        for(j=1;j<=c;j++)
        {
            if(s[j]+k[i]<=100)
		    {
		        if(j>max)max=j;//记录最大存放到第几个箱子
		        s[j]+=k[i];//s[j]代表某一个箱子的当前容量
                jishu[i]=j;//jishu[i]代表这一次存到了哪个箱子里
                break;
		    }
        }        
    }
    for(i=0;i<c;i++)
    {
        printf("%d %d\n",k[i],jishu[i]);
    }
    printf("%d",max);
}

3:单链表的处理(⭐⭐⭐⭐)

(需要掌握数组模拟链表,注意题干(当 k 为 0 时,表示删除头结点)说明要处理k=0时的情况)

#include <stdio.h>
const int N=1e6+10;
int n,m,idx;
int e[N],ne[N];
int head;
void init()
{
	head=-1;
	idx=0;
};
void addtou(int a)
{
	e[idx]=a;
	ne[idx]=head;
	head=idx++;
}
void add(int a,int b)
{
	e[idx]=b;
	ne[idx]=ne[a];
	ne[a]=idx++;
}
void remove(int a)
{
	ne[a]=ne[ne[a]];
}
int main()
{
	int T;
	scanf("%d",&T);
	getchar();
	int x,y;
	init();
	int cnt=0;
	while(T--)
	{
		cnt++;
		char u;
		scanf("%c",&u);
		if(u=='H')
		{
			scanf("%d",&y);
			addtou(y);
		}
		else if(u=='D')
		{
			scanf("%d",&x);
			if(x==0)head=ne[head];
			else remove(x-1);//因为idx从0开始而插入操作从第一个开始
		}
		else 
		{
			scanf("%d %d",&x,&y);
			add(x-1,y);//因为idx从0开始而插入操作从第一个开始
		}
		getchar();
	}
	for(int i=head;~i;i=ne[i])
	{
		printf("%d ",e[i]);
	}
	return 0;
}

4:这是一条水中的鱼()

(三个循环的内层循环都是一样的,主要是外层循环的i的不同)

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n*2+1;i++)printf("*");
	printf("\n");
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n-i;j++)
		{
			printf("*");
		}
		for(int j=0;j<i*2+1;j++)
		{
			printf(" ");
		}
		for(int j=0;j<n-i;j++)
		{
			printf("*");
		}
		printf("\n");
	}
	for(int i=n-2;i>=0;i--)
	{
		for(int j=0;j<n-i;j++)
		{
			printf("*");
		}
		for(int j=0;j<i*2+1;j++)
		{
			printf(" ");
		}
		for(int j=0;j<n-i;j++)
		{
			printf("*");
		}
		printf("\n");
	}
	for(int i=1;i<n/2+1;i++)
	{
		for(int j=0;j<n-i;j++)
		{
			printf("*");
		}
		for(int j=0;j<i*2+1;j++)
		{
			printf(" ");
		}
		for(int j=0;j<n-i;j++)
		{
			printf("*");
		}
		printf("\n");
	}
	for(int i=0;i<n*2+1;i++)printf("*");
	printf("\n");
	return 0;
}

5:王子爱公主(⭐⭐⭐⭐)

(王子需要确定公主的位置就要考虑最坏情况:随意派说的都是假话。所以支持派的人数要大于反对派加随意派的人数之和才能确定公主的位置,否则不能确定公主的位置)

王子如何确定公主:首先如果a>b+c,先询问2*(b+c)个问题,最坏情况是说假话的有b+c个人都说在i号房间,说真话的有b+c个人说在j号房间(i不等于j),此时还需要问一次(此时只剩下说真话的人),下一个人说在j号房间,此时公主就一定在j号房间

#include<stdio.h>
int main()
{	
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	if(a>b+c)printf("YES\n%d",(b+c)*2+1);
	else printf("NO");
	return 0;
}

6:伟伟的强迫症(⭐⭐)

(结构体排序)

#include <stdio.h>
using namespace std;
const int N=1e6+10;
int n,m;
struct aa
{
	int ID,w,f,p;
}q[N];
void swap(aa *a,aa *b)//交换两个结构体变量
{
	aa t=*a;
	*a=*b;
	*b=t;
}
signed main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d %d %d %d",&q[i].ID,&q[i].w,&q[i].f,&q[i].p);
	for(int i=0;i<n-1;i++)//冒泡排序
	{
		for(int j=0;j<n-1-i;j++)
		{
			if(q[j].w!=q[j+1].w)
			{
				if(q[j].w<q[j+1].w)
					swap(&q[j],&q[j+1]);
			}
			else if(q[j].f!=q[j+1].f)
			{
				if(q[j].f>q[j+1].f)
					swap(&q[j],&q[j+1]);
			}
			else if(q[j].p!=q[j+1].p)
			{
				if(q[j].p<q[j+1].p)
					swap(&q[j],&q[j+1]);
			}
			else 
			{
				if(q[j].ID>q[j+1].ID)
					swap(&q[j],&q[j+1]);
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		printf("%d %d %d %d\n",q[i].ID,q[i].w,q[i].f,q[i].p);
	}
	return 0;
}

7:小明质数筛(⭐⭐)

(它除了1和本身以外有且仅有一个可以除的尽的数一定是平方数,并且这个平方数一定是由一个质数平方得来的)

#include<stdio.h>
#include<math.h>
bool prime(int n)判断是否是质数
{
	if(n==2)return true;
	for(int i=2;i<=sqrt(n);i++)
		if(n%i==0)return false;
	return true;
}
int main()
{
	int n;
	scanf("%d",&n);
	bool bl=false;
	for(int i=2;i<=sqrt(n);i++)
	{
		if(prime(i))//如果这个数是质数,那么这个数的平方一定是满足题目条件的数
		{
			printf("%d\n",i*i);
			bl=true;
		}
	}
	if(!bl)printf("-1\n");//如果没有找到输出-1
}

8:小凯买巧克力(⭐⭐⭐⭐)

总花费>84(3*28)的部分全部用来买%85的巧克力(一定是最赚的),剩余的情况需要在草稿纸上枚举可能出现的所有情况,并且排除花费高并且价值低的情况(划线的为排除掉的)

剩下的情况全部列举出来

#include<stdio.h>
int main()
{
	int n,a=0,b=0,c=0;//a,b,c储存所有巧克力出现次数,a为浓度%65的巧克力,c为%85
	int x=20,y=25,z=28;
	scanf("%d",&n);
	while(n)
	{
		//printf("%d\n",n);
		if(n>=3*z)
		{
			n-=3*z;
			c+=3;
		}
		else if(n>=2*z+y)
		{
			n-=2*z+y;
			c+=2;
			b++;
		}
		else if(n>=z+2*y)
		{
			n-=z+2*y;
			c++;
			b+=2;
		}
        else if(n>=2*z+x)
        {
            n-=2*z+x;
            c+=2;
            a++;
        }
		else if(n>=3*y)
		{
			n-=3*y;
			b+=3;
		}
        else if(n>=z+y+x)
        {
            n-=x+y+z;
            a++;b++;c++;
        }
		else if(n>=2*z)
		{
			n-=2*z;
			c+=2;
		}
		else if(n>=y+z)
		{
			n-=y+z;
			b++;
			c++;
		}
		else if(n>=2*y)
		{
			n-=2*y;
			b+=2;
		}
        else if(n>=z+x)
        {
            n-=z+x;
            a++;
            c++;
        }
		else if(n>=y+x)
		{
			n-=y+x;
			b++;
			a++;
		}
		else if(n>=z)
		{
			n-=z;
			c++;
		}
		else if(n>=y)
		{
			n-=y;
			b++;
		}
		else if(n>=x)
		{
			n-=x;
			a++;
		}
		else break;
	}
	printf("85%%:%d\n",c);
	printf("75%%:%d\n",b);
	printf("65%%:%d\n",a);
}

9:阿黄爱字符串(⭐⭐⭐)

插入操作实际上只需要比较插入数组的首尾元素与原数组的相邻两个相同元素就可以了

#include<stdio.h>
int n,m;
int q[1000000];
signed main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		char a[100],b[100];
		int n,m;
		scanf("%d %d",&n,&m);
		getchar();
		scanf("%s %s",a,b);
		//n,m两个数组至少有一个是完美的
		bool bl=true;
		for(int i=1;i<n;i++)
		{
			if(a[i]!=a[i-1])continue;
			else {bl=false;break;}
		}
		if(bl)
		{
			puts("YES");
			//如果字符串n是完美的,不需要做任何操作
			continue;
		}
		else
		{
			bl=true;
			for(int i=1;i<m;i++)
			{
				if(b[i]!=b[i-1])
					continue;
				else 
				{
					bl=false;
					break;
				}
			}
			if(!bl)
			{
				//如果字符串a,b都不是完美的,则不可能变得完美
				puts("NO");
				continue;
			}
			else
			{
				
				char x=b[0],y=b[m-1];
				/*
				  如果字符串b是完美的,则尝试插到字符串a每两个相同的数字中间
				 */
				for(int i=1;i<n;i++)
				{
					if(a[i]==a[i-1])//尝试在a相同两项之间插入
					{
						if(x==a[i]||y==a[i-1])bl=false;
						//如果字符串a的相邻两个数字不相同并且字符串b的首尾和这两个数字相同,则不可能把a变得完美
					}
				}
				if(bl)puts("YES");
				else puts("NO");
			}
		}
	}
	return 0;
}

10:小海学字符串匹配(⭐⭐)

#include <stdio.h>
#include <string.h>
int main()
{
    double k;
    char a[110], b[110];
    scanf("%lf",&k);
    getchar();
    scanf("%s",a);
    scanf("%s",b);
    int cnt = 0;
    for (int i = 0; i < strlen(a); i ++ )
        if (a[i] == b[i])
            cnt ++ ;
    if (1.0*cnt / strlen(a) >= k) puts("yes");
    else puts("no");
    return 0;
}

11:信任与欺诈(⭐⭐⭐)

(难点;编号1-26编号,如果(x*2+1)%26得到的是0的话,实际编号为26)

#include <stdio.h>
#include <string.h>
int main() 
{
	int a,b,cnt=0;
	scanf("%d %d",&a,&b);
	char q[100];
	scanf("%s",q);
	while(a--)
	{
		char s[510];
		scanf("%s",s);
		bool bl=true;
		for(int i=0;i<strlen(s);i++)
		{
			if(s[i]<'a'||s[i]>'z')
			{
				bl=false;
				break;
			}
		}
		if(!bl)
		{
			puts("lie");
			cnt++;
		}
		else 
		{
			int cuo=0;
			for(int i=1;i<strlen(s);i++)
			{
				int t1=(s[i-1]-'a'+1)*2+1;
				if(t1==0)t1=26;
				int t2=(s[i-1]-'a'+1)*3-2;
				if(t2==0)t2=26;
				if(s[i]-'a'+1!=t1&&s[i]-'a'+1!=t2)cuo++;
				
			}
			if(cuo>=b)
			{
				puts("lie");
				cnt++;
			}
			else 
			{
				bl=true;
				for(int i=0;i<strlen(s);i++)
				{
					int j=0,k;
					if(q[0]==s[i])
						for(j=0,k=i;j<strlen(q);j++,k++)
						{
							if(q[j]!=s[k])break;
						}
					
					if(j==strlen(q))
					{
						bl=false;
					}
				}
				if(!bl)
				{
					puts("lie");
					cnt++;
				}
				else 
				{
					puts("truth");
				}
			}
		}
		
	}    
	printf("%d",cnt);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值