90分的你距离一百分差了什么(测试点#1WA的进来)
查看原帖
90分的你距离一百分差了什么(测试点#1WA的进来)
497817
羊摆摇楼主2022/10/13 13:34

省流:得用cin

以下是我的90分代码和100分代码:

90分code:

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

#define LL long long
typedef const int Int;

Int N=105,M=150;

int B[N];

int dp[N][M][M];

int n,m;

int sta[M],cnt[M],siz;

void dfs(int i,int stat,int cont){
	if(i>=m){
		sta[++siz]=stat,cnt[siz]=cont;
		return;
	}
	dfs(i+1,stat,cont);
	dfs(i+3,stat+(1<<i),cont+1);
}

bool checkPH(int k,int r){
	if(sta[k]&B[r])return false;
	return true;
}

bool check(int a,int b){
	if(sta[a]&sta[b])return false;
	return true;
}

int main(){
	char c;
	scanf("%d%d",&n,&m);
	for(int k=1;k<=n;k++){
		for(int k1=0;k1<m;k1++){
			c=getchar();
			if(c=='\n')c=getchar();
			if(c=='H'){
				B[k]+=(1<<k1);
//				cout<<k1<<endl;
			}
		}
	}
	dfs(0,0,0);
//	cout<<siz<<endl;
//	for(int k=1;k<=siz;k++){
//		cout<<sta[k]<<" "<<cnt[k]<<endl;
//	}
//	cout<<endl;
//	for(int k=0;k<=n;k++)cout<<B[k]<<endl;
	for(int k=1;k<=n;k++){
		for(int k1=1;k1<=siz;k1++){
			for(int k2=1;k2<=siz;k2++){
				if(!check(k1,k2)||!checkPH(k1,k)||!checkPH(k2,k-1))continue;
				for(int k3=1;k3<=siz;k3++){
					if(!check(k1,k3))continue;
					dp[k][k1][k2]=max(dp[k][k1][k2],dp[k-1][k2][k3]+cnt[k1]);
				}
			}
		}
	}
//	return 0;
	int ans=INT_MIN;
	for(int k=1;k<=siz;k++){
		for(int k1=1;k1<=siz;k1++)ans=max(ans,dp[n][k][k1]);
	}
	printf("%d",ans);
	return 0;
}

100分code:

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

#define LL long long
typedef const int Int;

Int N=105,M=150;

int B[N];

int dp[N][M][M];

int n,m;

int sta[M],cnt[M],siz;

void dfs(int i,int stat,int cont){
	if(i>=m){
		sta[++siz]=stat,cnt[siz]=cont;
		return;
	}
	dfs(i+1,stat,cont);
	dfs(i+3,stat+(1<<i),cont+1);
}

bool checkPH(int k,int r){
	if(sta[k]&B[r])return false;
	return true;
}

bool check(int a,int b){
	if(sta[a]&sta[b])return false;
	return true;
}

int main(){
	char c;
	scanf("%d%d",&n,&m);
	for(int k=1;k<=n;k++){
		for(int k1=0;k1<m;k1++){
			cin>>c;
			if(c=='\n')cin>>c;
			if(c=='H'){
				B[k]+=(1<<k1);
//				cout<<k1<<endl;
			}
		}
	}
	dfs(0,0,0);
//	cout<<siz<<endl;
//	for(int k=1;k<=siz;k++){
//		cout<<sta[k]<<" "<<cnt[k]<<endl;
//	}
//	cout<<endl;
//	for(int k=0;k<=n;k++)cout<<B[k]<<endl;
	for(int k=1;k<=n;k++){
		for(int k1=1;k1<=siz;k1++){
			for(int k2=1;k2<=siz;k2++){
				if(!check(k1,k2)||!checkPH(k1,k)||!checkPH(k2,k-1))continue;
				for(int k3=1;k3<=siz;k3++){
					if(!check(k1,k3))continue;
					dp[k][k1][k2]=max(dp[k][k1][k2],dp[k-1][k2][k3]+cnt[k1]);
				}
			}
		}
	}
//	return 0;
	int ans=INT_MIN;
	for(int k=1;k<=siz;k++){
		for(int k1=1;k1<=siz;k1++)ans=max(ans,dp[n][k][k1]);
	}
	printf("%d",ans);
	return 0;
}

显而易见,除了getchar输入改为cin输入外几近没有任何区别-

但是!就是这一个小小的区别,我调试了一个中午QAQ(后来是翻讨论区才知道要改的)

下载了测试点,#1就是样例,大家肯定是样例过了才敢交的,可是用getchar#1就会莫名返回一个7,而不是本地输出的6。

想问一下有没有人知道为什么这道题cin就能过,而getchar就会使输出值改变

2022/10/13 13:34
加载中...