很接近AC代码,却过不了
  • 板块题目总版
  • 楼主17179__
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/21 23:11
  • 上次更新2023/12/22 13:27:14
查看原帖
很接近AC代码,却过不了
1083512
17179__楼主2023/12/21 23:11

题目是UVA1623-神龙喝水

这是网上找到的一个已AC代码

代码链接

下面是WA代码

#include<stdio.h>
#include<set>
#include<vector>
#include<string.h>
using namespace std;
int days[1000000],vis[1000001];
set<int> ava;
vector<int> cler;
int main(){
#ifdef DEBUG
	freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
#endif
	int t,n,m;
	set<int>::iterator loc;
	scanf("%d",&t);
	while(t--){
		//ava是目前可用的喝水日的集合,cler是没下雨的日期组成的链表
		ava.clear();cler.clear();
		//vis是某一个池子上一次下雨的日子
		memset(vis,-1,sizeof(vis));
		scanf("%d%d",&n,&m);
		for(int j = 0;j < m;j++){
			scanf("%d",days+j);
			if(days[j] == 0){
				//如果当天下雨的池塘编号是0则将这个日期写入ava与vis
				ava.insert(j);
				cler.push_back(j);
			}
			else{
				//否则查找区间内最早的喝水日
				int index = days[j];
				//index是当前遍历到的这天的水池编号
				loc = ava.lower_bound(vis[index]);
				if(loc == ava.end()) goto fail;
				//喝水日对应的水池编号原本是0,改成负数表示这个喝水日被用来喝掉index水池里的水
				days[*loc] = -index;
				ava.erase(loc);
				vis[index] = j;
			}
		}
		printf("YES\n");
		//遍历cler里所有没下雨的日期的状态
		for(vector<int>::iterator iter = cler.begin();iter != cler.end();iter++){
			if(iter != cler.begin()) printf(" ");
			printf("%d",-days[*iter]);
		}
		printf("\n");
		continue;
		fail:printf("NO\n");
	}
	return 0;
}

和AC代码对比了很久,代码的整体结构几乎完全一样。

尝试把数组的大小改成2000000也是WA。

溢出应该是没有的,每次循环前也初始化了各个容器,尝试输入各种样例也能得到正确的答案。

问题究竟在何处呢?求高人解答!

2023/12/21 23:11
加载中...