XTU 2022年下学期C语言-课堂测验1

A冰墩墩和奖牌
依次比较,一旦不相同就能分出胜负

#include 
#define ll long long
int a[2][5];
int main()
{
	int t;
	scanf("%d",&t);
	for (int i=1;i<=t;i++)
	{
		for (int j=1;j<=3;j++)
			scanf("%d",&a[0][j]);
		for (int j=1;j<=3;j++)
			scanf("%d",&a[1][j]);
		bool p=0;
		for (int j=1;j<=3;j++)
		{
			if (a[0][j]>a[1][j])
			{
				printf("former\n");
				p=1;
				break;
			}
			if (a[0][j]<a[1][j])
			{
				printf("latter\n");
				p=1;
				break;
			}
		}
		if (!p)
			printf("same\n");
	}
	return 0;
}

B冰墩墩和冰壶
将坐标转换为离原点的距离存储,找到红黄队中最小的距离,分别枚举即可

#include 
#define ll long long
using namespace std;
int a[20],b[20];
int main()
{
	int t;
	scanf("%d",&t);
	while (t--)
	{
		int n;
		int cntb=0,cnta=0,minna=1e9,minnb=1e9;
		scanf("%d",&n);
		for (int i=1;i<=n;i++)
		{
			int x,y;
			char ch;
			scanf(" %c %d %d",&ch,&x,&y);
			if (ch=='Y')
			{
				b[++cntb]=x*x+y*y;
				if (minnb>b[cntb])
					minnb=b[cntb];
			}
			else
			{
				a[++cnta]=x*x+y*y;
				if (minna>a[cnta])
					minna=a[cnta];
			}
		}
		if (minna<=minnb)
		{
			printf("Win ");
			int sum=0;
			for (int i=1;i<=cnta;i++)
			{
				if (a[i]<minnb)
					sum++;
			}
			printf("%d\n",sum);
		}
		else
		{
			printf("Lose ");
			int sum=0;
			for (int i=1;i<=cntb;i++)
			{
				if (b[i]<minna)
					sum++;
			}
			printf("%d\n",sum);
		}
	}
	return 0;
}

C冰墩墩666
枚举每个进制,进制转换出现连续3个6即可。
要保证转换进制后位数至少有3位,枚举进制时只需枚举到 i ∗ i < = n i*i<=n ii<=n

#include 
#define ll long long
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
	while (t--)
	{
		int n;
		scanf("%d",&n);
		bool flag=0;
		for (int i=2;i*i<=n;i++)
		{
			int temp=n,sum=0;
			while (temp)
			{
				if (temp%i==6)
					sum++;
				else
					sum=0; 
				if (sum==3)
				{
					if (flag==1)
						printf(" ");
					printf("%d",i);
					flag=1;
					break;
				} 
				temp/=i;
			}
		}
		if (!flag)
			printf("-1");
		printf("\n");
	}
	return 0;
}

D冰墩墩和徽章
统计冰墩墩和志愿者拥有的徽章编号(a,b存储),再将某个编号出现的次数用suma,sumb存储。最后:
1.枚举 b i b_i bi ,志愿者编号为 b i b_i bi的徽章数 s u m b b i > = 2 sumb_{b_i}>=2 sumbbi>=2且冰墩墩没有这个徽章 s u m a b i = = 0 suma_{b_i}==0 sumabi==0
2.同理枚举 a I a_I aI

最后取较小值,每次结束将suma,sumb初始化

#include 
#define ll long long
using namespace std;
int a[1005],b[1005];
int suma[100005],sumb[100005];
int main()
{
    int t;
    scanf("%d",&t);
	while (t--)
	{
		int tola=0,tolb=0,cnta=0,cntb=0;
		int na,nb;
		scanf("%d",&na);
		for (int i=1;i<=na;i++)
		{
			int x;
			scanf("%d",&x);
			suma[x]++;
			if (suma[x]==1)
				a[++cnta]=x;
		}
		scanf("%d",&nb);
		for (int i=1;i<=nb;i++)
		{
			int x;
			scanf("%d",&x);
			sumb[x]++;
			if (sumb[x]==1)
				b[++cntb]=x;
		}
		
		
		for (int i=1;i<=cntb;i++)
		{
			if (suma[b[i]]==0&&sumb[b[i]]>1)
				tola++;
		}
		for (int i=1;i<=cnta;i++)
		{
			if (sumb[a[i]]==0&&suma[a[i]]>1)
				tolb++;
		}
		
		printf("%d\n",tola>tolb?tolb:tola);
		
		for (int i=1;i<=cnta;i++)
			suma[a[i]]=0;
		for (int i=1;i<=cntb;i++)
			sumb[b[i]]=0;
	}
	return 0;
}

E冰墩墩和玩偶
菜鸡只会用stl的map打暴力,做法就是递归分别找所有排列,然后用map打标记判重,不写递归也可以:直接循环枚举长度就好了
详细看代码

#include 
#define ll long long
using namespace std;
int sum;
string s;
map<string,int> mp;
string dfs(int l,int r)
{
	string ss="";
	if (l==r)
		ss+=s[l];//排列中只有一个字符
	else 
		ss=dfs(l,(l+r)/2)+dfs((l+r)/2+1,r);//递归左右排列
	if (mp[ss]==0)
		mp[ss]=1,sum++;
	return ss;
}
int main()
{
    int t;
    scanf("%d",&t); 
	while (t--)
	{
		mp.clear();//清空map
		sum=0;
		cin>>s;//c++读入字符串方法
		dfs(0,s.length()-1);//递归整个排列
		printf("%d\n",sum);
	}
	return 0;
}

F冰墩墩与颜色
n n n个位置,假设取 n − 1 n-1 n1位,这种颜色选法为 3 ∗ 2 ∗ 2... ∗ 2 3*2*2...*2 322...2,(2的数目为n-2个)
剩下一个位要与旁边颜色相同,共 n − 1 n-1 n1种情况

打表把 3*2^(n-2)求出(你用快速幂直接在循环里求也是可以的 ),最后输出答案即可(记得取余)

#include 
#define ll long long
const int mod=1e9+7;
int f[1000005];
int main()
{
    
    f[2]=3;
    for (int i=3;i<=1000000;i++)
    	f[i]=f[i-1]*2%mod;
    
    int t;
    scanf("%d",&t);
	while (t--)
	{
		int n;
		scanf("%d",&n);
		printf("%d\n",(ll)f[n]*(n-1)%mod);
	}
	return 0;
}

你可能感兴趣的:(c语言,深度优先,开发语言)