xtu-c语言考试复习-4

发布时间:2024年01月14日

1290

#include<stdio.h>

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		char s1[20],s2[20];
		scanf("%s%s",s1,s2);
		if((s1[0]=='r'&&s2[0]=='s')||(s1[0]=='p'&&s2[0]=='r')||(s1[0]=='s'&&s2[0]=='p'))
			puts("Alice");
		else if(s1[0]==s2[0])
			puts("Draw");
		else	puts("Bob");
	}
	
	return 0;
}

条件判断即可

1291

不会做,不知道怎么处理出来最小的差值,需要的礼物数目是一个比较大的数字,怎么取m个礼物,同时保证最大值和最小值的差值最小,随便选m 个礼物,然后计算最大值和最小值的差值,如果存在差值相等的情况,就把所有价格加起来,取一个最小的价值,但是怎么实现随便取m个礼物这个操作?

看了下之前的博客,原来是排序,维护一个滑动窗口的差值最小,在差值最小的情况下取最前面的窗口(严格升序排列)

#include<stdio.h>

#define N 1010

int a[N];

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		int n,m;
		scanf("%d%d",&n,&m);
		
		for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
		
		for(int i=1;i<=n;i++)
		{
			for(int j=i;j<=n;j++)
			{
				if(a[i]>a[j])
				{
					int temp=a[i];
					a[i]=a[j];
					a[j]=temp;
				}
			}
		}
		
		int gap=100000;
		int sum=0;
		for(int i=1;i<=n-m+1;i++)
		{
			int temp=a[i+m-1]-a[i];
			if(gap>temp)	
			{
				gap=temp;
				sum=0;
				for(int j=i;j<=i+m-1;j++)
					sum+=a[j];
			}
		}
		
		printf("%d %d\n",gap,sum);
	}
	
	return 0;
}





还发现一个细节,sum在循环里面需要初始化为0,不然每一次循环累计,结果会和样例对不上,还有如果区间长度是3的话,从第一个元素开始数,只需要数两次,也就是说,假设第一个元素是,a[3],区间长度是3,区间最后元素是a[5],单独拿出来考虑比较简单,但是写代码的时候容易忽略

1278

#include<stdio.h>
#include<stdbool.h>

#define N 10010

int a[N];

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		int n;
		scanf("%d",&n);
		
		for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
		int d=a[2]-a[1];
		bool flag=false;
		for(int i=2;i<=n-1;i++)
		{
			if(a[i+1]-a[i]!=d)
			{
				puts("No");
				flag=true;
				break;
			}
		}
		if(!flag)	puts("Yes");
	}
	
	return 0;
}

1406

程序写的卡的动都动不了,不知道啥原因

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

int cnt1[30],cnt2[30];

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		int length,times;
		scanf("%d%d",&length,&times);
		char s1[1010],s2[1010];
		scanf("%s",s1);
		scanf("%s",s2);
		
		int l1=strlen(s1),l2=strlen(s2);
		for(int i=0;i<=l1;i++)
			cnt1[s1[i]-'a']++;
		for(int i=0;i<l2;i++)
			cnt2[s2[i]-'a']++;
		
		int m1=0,m2=0;
		for(int i=0;i<26;i++)	if(cnt1[i]>m1)	m1=cnt1[i];
		for(int i=0;i<26;i++)	if(cnt2[i]>m2)	m2=cnt2[i];
		
		if(m1+times>=length)	m1=length;
		if(m2+times>=length)	m2=length;
		
		if(m1>m2)	puts("Alice");
		else if(m1==m2)	puts("Draw");
		else	puts("Bob");
		
		memset(cnt1,0,sizeof cnt1);
		memset(cnt2,0,sizeof cnt2);
	}
	
	return 0;
}

这样子可以过,宁愿多设置几个变量,另外我前面少考虑了一种情况,就是如果一个字符串全是相同的字符,然后操作次数为1的话,答案一定是字符串长度减去1

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

char s1[1010],s2[1010];
int cnt1[30],cnt2[30];

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		int n,m;
		scanf("%d%d",&n,&m);
		scanf("%s",s1);
		scanf("%s",s2);
		
		int m1=0,m2=0;
		for(int i=0;i<n;i++)
		{
			cnt1[s1[i]-'a']++;
			cnt2[s2[i]-'a']++;
			
			if(cnt1[s1[i]-'a']>m1)	m1=cnt1[s1[i]-'a'];
			if(cnt2[s2[i]-'a']>m2)	m2=cnt2[s2[i]-'a'];
		}
		
		int alice=0,bob=0;
		if(m1==n)
		{
			if(m==1)	alice=n-1;
			else if(m1+m>=n)	alice=n;
		}
		else if(m1+m>n)	alice=n;
		else alice=m1+m;
		
		if(m2==n)
		{
			if(m==1)	bob=n-1;
			else if(m2+m>=n)	bob=n;
		}
		else if(m2+m>n)	bob=n;
		else bob=m2+m;
		
		if(alice>bob)	puts("Alice");
		else if (alice==bob)	puts("Draw");
		else	puts("Bob");
		
		memset(cnt1,0,sizeof cnt1);
		memset(cnt2,0,sizeof cnt2);
	}
	
	return 0;
}
文章来源:https://blog.csdn.net/L3102250566/article/details/135579669
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。