2021/05/21 1012 The Best Rank (25 分)c语言实现(简单粗暴)

在这里插入图片描述
在这里插入图片描述

本题一上来最容易想到的就是暴力排序;事实上我也是这么做的。。
建立结构体
用qsort将各科成绩排一下,得到每个人的成绩排名;再择优输出即可;
但是我这里遇上了个未知Bug 编译器的输出和pta上的不一致。。导致第0个测试点过不了但是我自己编译器上却能过

这个位置不可能出现输出“C”的情况吧。。
这个位置用我的编译器不可能输出C的啊。。我自己调试过了的。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

除此之外其他都没问题,包括诸如相同分数的两个人排名应该一致也已经考虑进去了。
代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct num{
	char id[10];
	int C,M,E;
	double A;	
	int num_c,num_m,num_e,num_a;
};
int cmp1(const void *a,const void *b)
{
	struct num *pa,*pb;
	pa=(struct num*)a;
	pb=(struct num*)b;
	return pb->C-pa->C; 
}
int cmp2(const void *a,const void *b)
{
	struct num *pa,*pb;
	pa=(struct num*)a;
	pb=(struct num*)b;
	return pb->M-pa->M; 
}
int cmp3(const void *a,const void *b)
{
	struct num *pa,*pb;
	pa=(struct num*)a;
	pb=(struct num*)b;
	return pb->E-pa->E;  
}
int cmp4(const void *a,const void *b)
{
	struct num *pa,*pb;
	pa=(struct num*)a;
	pb=(struct num*)b;
	return pb->A-pa->A; 
}
void printS(struct num *p)
{
	if(p->num_a<=p->num_c&&p->num_a<=p->num_e&&p->num_a<=p->num_m)
	{
		printf("%d A\n",p->num_a);
	}
	else if(p->num_c<=p->num_m&&p->num_c<=p->num_e&&p->num_c<p->num_a)
	{
		printf("%d C\n",p->num_c);
	}
	else if(p->num_m<p->num_c&&p->num_m<=p->num_e&&p->num_m<p->num_a)
	{
		printf("%d M\n",p->num_m);
	}
	else if(p->num_e<p->num_c&&p->num_e<p->num_m&&p->num_e<p->num_a)
	{
		printf("%d E\n",p->num_e);
	}
}
int main()
{
	int n,m,i;
	char id[10];
	struct num stu[2000];
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++)
	{
		scanf("%s%d%d%d",&stu[i].id,&stu[i].C,&stu[i].M,&stu[i].E);
		stu[i].A=(stu[i].C+stu[i].M+stu[i].E)*1.0/3;   //将*1.0去掉就能AC了			
	}
	qsort(stu,n,sizeof(stu[0]),cmp1);
	for(i=0;i<n;i++)
	{
	    stu[i].num_c=i+1;  //赋予排名
        if(stu[i].C==stu[i-1].C)  //如果上一位同学的成绩与他一样 将他们排名一致化
        stu[i].num_c=stu[i-1].num_c;
    }
	qsort(stu,n,sizeof(stu[0]),cmp2);
	for(i=0;i<n;i++)
	{
	stu[i].num_m=i+1;  //赋予排名
	if(stu[i].M==stu[i-1].M&&i>0)
    stu[i].num_m=stu[i-1].num_m;
    }
	qsort(stu,n,sizeof(stu[0]),cmp3);
	for(i=0;i<n;i++)
	{
	stu[i].num_e=i+1;  //赋予排名
	if(stu[i].E==stu[i-1].E)
    stu[i].num_e=stu[i-1].num_e;
    }
	qsort(stu,n,sizeof(stu[0]),cmp4);
	for(i=0;i<n;i++)
	{
	stu[i].num_a=i+1;  //赋予排名
	if(stu[i].A==stu[i-1].A)
    {
    stu[i].num_a=stu[i-1].num_a;	
	}
    }
	int ret=0,j;
	for(i=0;i<m;i++)
	{
		scanf("%s",&id);
		for(j=0;j<n;j++)
		{
			if(strcmp(id,stu[j].id)==0)
			{
				printS(&stu[j]);
				ret=1;
			}			
		}
		if(ret==0)
		printf("N/A\n");
		ret=0;
	}	
	return 0;
}

经过修改(去掉一个*1.0)已经AC了。只是仍旧未知为何在pta平台上就不行。。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个采用回溯法求解0/1背包问题的C语言实现: ``` #include <stdio.h> #include <stdlib.h> #define MAX_N 20 //物品数量最大值 #define MAX_W 100 //背包容量最大值 int n, W; //物品数量、背包容量 int w[MAX_N], v[MAX_N]; //物品重量、价值 int best_v; //最优解的价值 int cur_w, cur_v; //当前解的重量、价值 int used[MAX_N]; //当前解中物品是否已选标记数组 //回溯函数 void backtrack(int t) { if (t > n) { if (cur_v > best_v) best_v = cur_v; return; } //不选第t个物品 used[t] = 0; backtrack(t + 1); //选第t个物品 if (cur_w + w[t] <= W) { used[t] = 1; cur_w += w[t]; cur_v += v[t]; backtrack(t + 1); cur_w -= w[t]; cur_v -= v[t]; used[t] = 0; } } int main() { printf("请输入物品数量和背包容量:\n"); scanf("%d%d", &n, &W); printf("请输入每个物品的重量和价值:\n"); for (int i = 1; i <= n; i++) scanf("%d%d", &w[i], &v[i]); best_v = 0; cur_w = cur_v = 0; backtrack(1); printf("最优解的价值为:%d\n", best_v); return 0; } ``` 该程序采用了递归回溯的思想,通过枚举所有可能的选择方案,得到最优解的价值。其中,used数组用于标记当前解中哪些物品已经选中,cur_w和cur_v分别表示当前解的重量和价值。在每次递归时,先尝试不选第t个物品,然后再尝试选第t个物品。如果选了第t个物品,就要更新当前解的重量和价值,并将used数组中第t个位置标记为1,表示该物品已选中。当t>n时,说明已经枚举完了所有物品,此时如果当前解的价值比最优解的价值更大,就更新最优解的价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值