Map构造是否存在问题?OJ特殊样例无法通过求助
问题诊断与修复方案
嘿,我一眼就瞅到你代码里的关键问题了,这绝对是特殊样例翻车的元凶:
核心bug:错把首个输入店铺当成了"memory"
你计算排名时用dic[names[0]]作为对比基准,但题目里只要求关注名为**"memory"**的店铺——它完全可能出现在输入的任意位置,不一定是第一个啊!这就导致你的代码在大部分情况下,算的都是第一个店铺的排名,而非"memory"的,自然会在"memory"不是首个输入的测试用例里出错。
修复思路(超简单!)
直接把对比基准换成dic["memory"]就行!你已经用map<string, int>存了所有店铺的价格,通过键名"memory"就能直接拿到它的当前价格,根本不需要依赖输入顺序。
另外给你加个小优化:可以把读取s和p的两个scanf合并成一个,代码会更简洁。
修正后的完整代码
#include<algorithm> #include<iostream> #include<map> #include<cstdio> using namespace std; const int maxn = 10010; int main(){ int n,m; map<string ,int> dic ; char names[maxn][32]; scanf("%d",&n); for(int i = 0;i<n;i++){ scanf("%s",names[i]); dic[names[i]] = 0; } scanf("%d",&m); while(m--){ for(int i = 0;i<n;i++){ int temp; char tp[32]; scanf("%d %s", &temp, tp); // 合并读取,更简洁 dic[tp] += temp; } int target_price = dic["memory"]; int ranking = 1; for(int j = 0;j<n;j++){ if(dic[names[j]] > target_price){ ranking++; } } printf("%d\n",ranking); } return 0; }
额外验证说明
- 输入读取逻辑:题目要求每行是
s(涨价数值)和p(店铺名),你的代码读取顺序是对的,没问题。 - 价格累积逻辑:
map全局维护价格,每日涨价会累加,符合"每日涨价后"的要求。 - 排名计算逻辑:初始为1,每遇到价格更高的店铺就加1,完全匹配题目"t家高于则排名t+1"的规则。
内容的提问来源于stack exchange,提问作者Bat_man
相关产品推荐
相关产品推荐

