- 黄乾峻 的博客
7月Day2
- @ 2025-7-16 18:48:37
T1 缺失的数字
题意:小z本来有一串连续的数字(比如1,2,3,4,5),但不小心弄丢了一个。现在给你剩下的数字(顺序可能是乱的),让你找出丢的是哪个数。 思路:先找到这串数字的最小值和最大值(如1和5)。计算原本完整的和(1+2+3+4+5=15)。再算现在剩下的和(1+3+4+5=13)。用完整和减去剩下的和(15-13=2),就知道丢的是2了。 代码:
#include<bits/stdc++.h>
using namespace std;
int a[1010];
int main(){
freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
int m;
int n,l=1000,r=1;
int sum1=0,sum2=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
l=min(l,a[i]);
r=max(r,a[i]);
sum2+=a[i];
}
sum1=(l+r)*(r-l+1)/2;
m=sum1-sum2;
cout<<m;
return 0;
}
T2 不及格
题意:这道题描述了一个考试场景,有N名学生参加了考试,每个学生都有一个得分。如果学生的得分低于某个给定的分数P,那么这个学生就被视为不及格,无法获得学分。题目要求我们计算出不及格的学生有多少人。 思路:首先,我们需要读取三个数据,分别是学生总数N、格分数线P,每个学生的得分a_i。然后,我们逐一检查每个学生的得分,看看是否低于及格线P。每当发现一个学生的得分低于P,我们就把这个学生计入不及格的人数中。最后,我们输出不及格学生的总人数。 代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,P;
cin>>N>>P;
int count=0;
for(int i=0;i<N;i++){
int s;
cin>>s;
if(s<P){
count++;
}
}
cout<<count<<endl;
return 0;
}
T3 集会
题意:有N个人住在一条数轴上,每个人有一个固定的坐标。要找一个整数坐标P作为集会地点,使得所有人到P点的距离的平方和最小。这个平方和就是他们参加集会所需花费的总体力点数。 思路:因为每个人的坐标在1到100之间,所以集会地点P也只需考虑1到100之间的整数。对于每个可能的P值,计算所有人到P点的距离的平方,然后将这些平方值相加,得到该P值下的总体力花费。比较所有P值下的总体力花费,找到其中的最小值。 代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("jihui.in","r",stdin);
freopen("jihui.out","w",stdout);
int N;
cin>>N;
vector<int>X(N);
for(int i=0;i<N;i++){
cin>>X[i];
}
int m=INT_MAX;
for(int P=1;P<=100;P++){
int c=0;
for(int x:X){
c+=(x-P)*(x-P);
}
m=min(m,c);
}
cout<<m<<endl;
return 0;
}
T4 统计区间
题意:这道题目要求我们找出一个整数序列中所有和为K的连续子序列的数量。简单来说,就是给定一组数字和一个目标值K,我们需要计算有多少段连续的数字加起来正好等于K。 思路:首先,计算序列A的前缀和数组,每个位置到序列开头的元素和。然后,遍历前缀和组,对于每个位置,检查是否存在一个之前的位置,使得这两个位置的前缀和之差等于K。如果找到这的位置对,说明它们之间的子序列和就是K。最后,统计所有满足条件的子序列数量,并输出结果。 代码: 第1种:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
ll a[N],s[N],n,k;
int main(){
freopen("tjqj.in","r",stdin);
freopen("tjqj.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
unordered_map<ll,ll>mp;
ll ans=0;
for(int i=0;i<=n;i++){
ans=0;
mp[s[i]]++;
ans=max(ans,s[i]);
}
cout<<ans;
return 0;
}
第2种:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,k,a[N],s[N],ans;
unordered_map<int,int>mp;
signed main(){
freopen("tjqj.in","r",stdin);
freopen("tjqj.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
mp[0]++;
for(int i=1;i<=n;i++){
if(mp[s[i]-k]>0)ans+=mp[s[i]-k];
mp[s[i]]++;
}
cout<<ans;
return 0;
}
T5 旅行
题意:有N个城市和M条单向道路,要计算有多少对城市可以作为旅行的起点和终点,且起点和终点顺序不同要视为不同对。 思路:首先,我们计算出所有可能的城市对数量,即N乘以N,因为每个城市都可以是起点或终点。然后,我们需要考虑单向道路的限制。由于道路是单向的,有些城市对之间可能无法直接到达。这里,我们可以构建一个图,用节点表示城市,用边表示道路,然后进行图的遍历,找出所有可以相互到达的城市对。最后,我们统计出所有可以相互到达的城市对数量,并输出这个结果。 代码:
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int n;
vector<int> adj[2010];
bool vis[2010];
void dfs(int u){
if(vis[u]) return;
vis[u]=1;
for(int i=0;i<adj[u].size();i++){
dfs(adj[u][i]);
}
}
int main(){
int n,m,ans=0;
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
adj[a].push_back(b);
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof vis);
dfs(i);
for(int j=1;j<=n;j++)
if(vis[j])ans++;
}
cout<<ans;
return 0;
}