T1 缺失的数字

错因:计数数组开小; 思路:cnt数组统计数,遍历找出空出的数字;

#include <bits/stdc++.h>
using namespace std;
int cnt[1200];
int main(){
	freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
	int n,min=9999,max=-1;
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		cnt[x]=1;
		if(x>max)max=x;
		if(x<min)min=x;
	}
	for(int i=min;i<=max;i++){
		if(cnt[i]==0){
			cout<<i;
			return 0;
		}
	}
	return 0;
}

T3 集会

有N个人住在一条数轴上。第i个人住在坐标x i处。 你需要举办一个所有N个人都必须参加的集会。 集会可以在任意整数坐标处举行。如果你选择在坐标P处举行集会,第i个人将花费(Xi−P(Xi−P)点体力来参加集会.求出N个人必须花费的最小总体力点数。 错因:min开小了; 总数的值应比99999大; 思路:遍历所有p的点,找出最小的总体力值;

#include <bits/stdc++.h>
using namespace std;
int a[120];
int b[120];
int main(){
	freopen("jihui.in","r",stdin);
	freopen("jihui.out","w",stdout);
	int n,sum=0,min=2e9;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=100;i++){
		sum=0;
		for(int j=1;j<=n;j++)sum=sum+(a[j]-i)*(a[j]-i);
		b[i]=sum;
	}
	for(int i=1;i<=100;i++)if(b[i]<min)min=b[i];
	cout<<min;
	return 0;
}

T4

错因:未简化时间; 思路:分段算总数可以简化,;

#include <bits/stdc++.h>
using namespace std;
long long a[200020];
long long b[200020];
int main(){
	freopen("tjqj.in","r",stdin);
	freopen("tjqj.out","w",stdout);
	long long n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=b[i-1]+a[i];
	}
	unordered_map<long long,long long>c;
	long long x=0;
	for(int i=0;i<=n;i++){
		x=x+c[b[i]-k];
		c[b[i]]++;
	}
	cout<<x;
	return 0;
}

T5

我无思路 思路:用哈吸表递归遍历全部城;

#include <bits/stdc++.h>
using namespace std;
int n;
vector<int>c[2010];
bool v[2010];
void x(int u){
	if(v[u])return;
	v[u]=1;
	for(int i=0;i<c[u].size();i++){
		int j=c[u][i];
		x(j);
	}
};
int main(){
	freopen("lx.in","r",stdin);
	freopen("lx.out","w",stdout);
	int n,m,s=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		c[a].push_back(b);
	}
	for(int i=1;i<=n;i++){
		memset(v,0,sizeof v);
		x(i);
		for(int j=1;j<=n;j++)if(v[j])s++;
	}
	cout<<s;
	return 0;
}