0分,全TLE,应该是输入问题,但我本地可以得到答案的...求助
查看原帖
0分,全TLE,应该是输入问题,但我本地可以得到答案的...求助
626618
Luckz楼主2023/1/20 11:52
//最长不上升子序列 
#include <iostream>
using namespace std;

int num[100005];
int dp[100005];
int cnt = 1;

int main() {
	int s = 0, w = 1, index = 1;//s表示数值,w表示符号
	char c;
	bool flag = 1;
	while(1) {
		c = getchar();
		while(c < '0' || c > '9') {
			if(c == '-') 
				w *= -1; 
			c = getchar();
		} 
		while(c >= '0' && c <= '9') {
			s = s * 10 + c - '0';
			c = getchar();
		}
		num[index] = w * s;
		index++;
		w = 1, s = 0;
		if(c == '\n')
			break;
	}
	dp[1] = num[1];
	for(int i = 2; i < index; i++) {
		if(num[i] <= dp[cnt])
			dp[++cnt] = num[i];
		else {
			int l = 1, r = cnt;
			int ans = 1;
			while(l <= r) {
				int mid = (l + r) / 2;
				if(dp[mid] <= num[i]) {
					r = mid - 1;
					ans = mid;	
				}	
				else {
					l = mid + 1;
				}	
			}
			dp[ans] = num[i];
		}
	}
	printf("%d\n", cnt);
	cnt = 1;
	//贪心:选择高度最低的那个导弹防御系统拦截
	for(int i = 1; i < index; i++) {
		dp[i] = 0;
	} 
	for(int i = 1; i < index; i++) {
		int l = 1, r = cnt;
		while(l <= r) {
			int mid = (l + r) / 2;
			if(num[i] > dp[mid]) 
				l = mid + 1;
			else
				r = mid - 1;
		}
		int x = l;
		if(x > cnt) {
			cnt = x;
			dp[x] = num[i];
		}
	}
	printf("%d\n", cnt);
	return 0;
} 

上面的是我的读入方法,本地能得到正确答案,但洛谷评判时全TLE。

while(~scanf("%d",&num[++index])); 

这种是题解的读入方法,但我Devcpp(VS也是)会卡住死循环

2023/1/20 11:52
加载中...