- 高士渠 的博客
7月day2
- @ 2025-7-16 18:50:04
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;
}