天梯赛题目 L2-039 清点代码库

作者分享了一次在编程比赛中遇到的问题,涉及到C++程序中的测试样例设计不合理,样例中对输入-0的处理导致程序错误。通过深入分析,发现输入字符串类型的处理与整数类型不同,影响了程序正确输出。
摘要由CSDN通过智能技术生成

这傻逼天梯赛啊!我整天被它后台的样例搞疯了!题干一直都说得不清不楚的,样例却是面面俱到,生怕参赛选手写的代码和他的相法有一丁点不同。 

现在就这道题,我前面有一条博文https://blog.csdn.net/weixin_60705585/article/details/137547495?spm=1001.2014.3001.5502说我发现这个题目肯定存在一个坑爹的测试样例,这回我就这个问题进行了探索,确定出具体是什么问题了!

这个题目的后台测试样例里有一个样例存在输入为 “-0” 的存在,但是他样例输出的时候,他不输出“-0”,他输出“0”,我真的无语了!

我就是那个大冤种!

大家都是直接读int类型进来,然后int类型输出,过了。

我用string读,用string为哈希的key,然后在输出的时候,就不用遍历输出了,直接输出string就可以了,结果错了

我真的是当时恼羞成怒了,浪费了我好长时间。天梯赛的测试样例真的是阴间啊!

然后一点点排查,最后发现这个问题:int输出对了,我将string输入作为string输出错了。

然后最近心态平稳了,想具体排除一下原因,写一堆测试代码。

最后,查出最后一个3分的样例中确实存在傻逼的“-0”输入的问题!

样输入是“-0”,输出是“0” ✔,跟他一样输出 ”-0“ ×。

真的是让人无语!

#include<bits/stdc++.h>
using namespace std;

class uop{
	public:
		string s;
		int num;
		vector<int> nums;
};

bool cmp(uop &a ,uop& b){
	if(a.num!=b.num) return a.num>b.num;
	for(int i=0;i<a.nums.size();i++){
		if(a.nums[i]!=b.nums[i]) return a.nums[i]<b.nums[i];
	}
	return false;
}

int main(){
	map<string,uop> tg;
	int N,M;
	cin>>N>>M;	
	for(int i=0;i<N;i++){
		string temp="",op;
		vector<int> otp;
		for(int j=0;j<M;j++){
			if(j==0){
				cin>>temp;
				otp.push_back(atoi(temp.c_str()));
			}
			else{
				cin>>op;
				temp+=" "+op; 
				otp.push_back(atoi(op.c_str()));
                //测试出确实存在傻逼的“-0”输入的样例
                // if(op=="-0"){
                //     cout<<endl;
                // }
			}
		}
		if(tg.find(temp)!=tg.end()){
			tg[temp].num++;
		}else{
			tg[temp].num=1;
			tg[temp].nums=otp;
			tg[temp].s=temp;
		}
	}
	vector<uop> dat;
	for(auto it2=tg.begin();it2!=tg.end();it2++){
		uop kl;
		dat.push_back(it2->second);
	}
	printf("%d\n",dat.size());
	sort(dat.begin(),dat.end(),cmp);
	for(int i=0;i<dat.size();i++){
		printf("%d",dat[i].num);
		string uiop="";
		for(int t:dat[i].nums){
			uiop+=" "+to_string(t);
		}
		cout<<uiop<<endl;
	}
	return 0;
}

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值