为啥全wa了啊啊啊
本帖最后由 陈尚涵 于 2023-10-14 12:06 编辑今天在某股做题的时候成功保灵{:10_250:}
样例过了,代码我寻思也没什么问题,绿题我也就蹭点分{:10_256:}
虽然开o2后是只t了一个点,但是其他都是wa{:10_277:}
望大佬能指教一下,我这个蒟蒻连简单的模拟都能保灵{:10_258:}
https://www.luogu.com.cn/problem/P5076
附上我的代码:#include <iostream>
#include <map>
using namespace std;
map<int,int> a; // 数->排名
int b; // 排名->数
int cnt;
int main(){
int q;
cin >> q;
for (int i = 1; i <= q; i++){
int op, x;
cin >> op >> x;
if (op == 5){
b[++cnt] = x;
a = cnt;
for (int j = cnt - 1; j >= 1; j--){
// b为x
if (b < b){
a]--;
a]++;
int t = b;
b = b;
b = t;
} else {
break;
}
}
} else if (op == 1){
cout << a << endl;
} else if (op == 2){
cout << b << endl;
} else if (op == 3){
if (a == 1){
cout << -2147483647 << endl;
} else {
cout << b-1] << endl;
}
} else if (op == 4){
if (a == cnt){
cout << 2147483647 << endl;
} else {
cout << b+1] << endl;
}
}
}
return 0;
}
@tommyyu @liuhongrun2022 @zhangjinxuan @学习编程中的Ben
{:10_266:}
这个题目的主要思路是维护一个数的排名和排名对应的数,然后根据操作类型进行相应的操作。
根据您提供的代码,我看到您的代码在第 21 行中有一个空格,这个空格可能会导致编译错误。
另外,您的代码在第 13 行中定义了cnt ,但是在代码中没有给它赋初值,这可能会导致一些奇怪的问题。建议在定义时给它赋初值,比如int cnt = 0; 。
至于您的代码为什么会出现 WA 的情况,我看到您的代码在第 16 行中将数值x对应的排名赋值为cnt ,但是没有判断这个数值是否已经存在于a中。如果这个数值已经存在于a中,那么您需要更新它的排名,而不是直接将其赋值为cnt 。这个问题可能会导致您的代码在一些测试数据中出现错误。
另外,您的代码在第 18-25 行中实现了对排名的更新,但是这个更新方法可能存在问题。具体来说,当您将一个数值插入到排名数组中时,您需要将它与前面的数值进行比较,如果它比前面的数值小,那么就需要将前面的数值向后移动一位,并将它的排名减一。但是您的代码在更新排名时只是简单地将排名减一,而没有考虑到前面的数值是否需要向后移动。这个问题可能会导致您的代码在一些测试数据中出现错误。
因此,您需要修改您的代码,解决上述问题。具体来说,您需要在第 16 行中判断数值x是否已经存在于a中,如果存在,需要更新它的排名;在第 18-25 行中,您需要修改排名的更新方法,确保它能够正确地将数值插入到排名数组中,并更新排名。 抱歉,我是一个语言模型,无法执行代码。但我可以看出您的代码中可能存在一些问题。以下是对您的代码进行的一些分析和建议:
1. 样例过了但其他点WA:这很可能是由于您的代码在某些情况下没有正确处理边界条件或者逻辑错误导致的。应该仔细检查每个操作的实现逻辑,确保在各种情况下都能正确地返回预期的结果。
2. 使用map进行排序和排名:您使用map来构建数到排名的映射关系是可行的。但需要注意,在map中,元素是按照键的顺序进行排序的,不需要手动实现排序逻辑。因此,您可以简化代码,不需要维护数组b和手动交换元素。只需通过map记录数和对应的排名即可。
3. 注意解决越界问题:在题目描述的范围内,可以看出特殊情况下可能会出现 -2147483647 和 2147483647 的输出。您在比较排名时要注意处理边界情况,确保不会出现数组越界。
4. 对操作 3 和操作 4 的处理:注意操作 3 和操作 4 是获取给定数的前一个数和后一个数,当给定数是最小值或最大值时,需要返回相应的边界值。您需要确保对应的边界情况正确处理。
5. 处理输入输出:请确保使用正确的输入数据类型并进行适当的错误处理。另外,根据题目要求,将所有输出放在循环结束后一次性输出,而不是每次操作输出一次。
综上所述,我建议您重新审查代码逻辑,并注意修复潜在的边界条件和逻辑错误。希望这些建议对您有帮助!如果您有具体的问题或需要进一步的指导,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:} 活该
参考一下文章:
https://www.cnblogs.com/LuoJMeng/p/16221616.html
https://blog.csdn.net/qq_17807067/article/details/127390544
https://blog.51cto.com/u_3044148/3349106
https://www.cnblogs.com/hatredvirus/p/16218822.html
具体思路里面都有 哈哈哈你也用stl啊哈哈哈
确实活该(bushi 哈哈真的难蚌,我是用set做的,给你参考一下。
#include <iostream>
#include <set>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
multiset<long long> s;
long long q,op,x;
cin>>q;
for(int i=0;i<q;i++)
{
cin>>op>>x;
switch(op)
{
case 5:
{
s.insert(x);
break;
}
case 4:
{
if(s.empty())
{
cout<<2147483647<<endl;
break;
}
auto it=s.upper_bound(x);
if(it==s.end())
{
cout<<2147483647<<endl;
}
else
{
cout<<*it<<endl;
}
break;
}
case 3:
{
if(s.empty())
{
cout<<-2147483647<<endl;
break;
}
if(!s.empty() and x<=*(s.begin()))
{
cout<<-2147483647<<endl;
break;
}
auto it=s.lower_bound(x);
it--;
cout<<*it<<endl;
break;
}
case 2:
{
auto it=s.begin();
for(int i=1;i<x;i++)
{
it++;
}
cout<<*it<<endl;
break;
}
case 1:
{
int i=0;
bool flag=true;
for(auto it=s.begin();it!=s.end();it++,i++)
{
if(*it>=x)
{
cout<<i+1<<endl;
flag=false;
break;
}
}
if(flag)cout<<s.size()+1<<endl;
break;
}
}
}
}
页:
[1]