1.给定一个整数序列,求中位数
这题应该是想让我们自己动手写快排吧。
#include<iostream>
#include<vector>
using namespace std;
void quicksort(vector<int> &nums,int left,int right){
if(left>=right)
return;
int i=left,j=right;
int priot=nums[left];
while(i<j){
while(i<j&&nums[j]>=priot){
j--;
}
nums[i]=nums[j];
while(i<j&&nums[i]<priot){
i++;
}
nums[j]=nums[i];
}
nums[i]=priot;
quicksort(nums,left,i-1);
quicksort(nums,i+1,right);
}
int main(){
vector<int> nums;
int c;
do {
cin >> c;
nums.emplace_back(c);
} while (cin.get() != '\n');//不定长输入,这个容易忘,记一下!!!
quicksort(nums,0,nums.size()-1);
int n=nums.size();
if(n%2==0)
cout<<(nums[n/2]+nums[n/2-1])/2<<endl;
else
cout<<nums[n/2]<<endl;
return 1;
}
【不定长输入,这个容易忘,记一下!!!】
vector<int> nums;
int c;
do {
cin >> c;
nums.emplace_back(c);
} while (cin.get() != '\n');
2.
给定一个9位数字的ISBN,求其校验位。ISBN格式为2-02-033598,校验位的计算方法如下:从左到右依次将各位数字乘10,9,8,……,2,求出其和S,作模运算得M=S mod 11。若11-M在1和9之间,校验位即为该数字;若11-M等于10,校验位为X;11-M等于11,校验位为0。输出添加校验位的ISBN,如2-02-033598-0。
#include<iostream>
using namespace std;
int main(){
string s;
cin>>s;
//2-02-033598,输入
int i=0,n=s.size(),num=10,sum=0;
while(i<n){
if(s[i]!='-'){
sum+=(s[i]-'0')*num;
num--;
}
i++;
}
s+='-';
sum=11-sum%11;
if(sum==10)
s+='X';
else if(sum==11)
s+='0';
else
s+=sum+'0';
cout<<s<<endl;
return 1;
}
3.
一个无向图,顶点为N个,其中M条边已给定,现在要从K条备选边中选出若干条,使得整个图连通,且选出的边权值和最小。
输入
第一行输入三个整数N(N<100), M, K,接下来一行为K个整数表示备选边的编号。然后是是M行,每行三个数字:u,v,d(0<d<10000)表示结点u和结点v的边,权值为d,编号按照输入输入顺序依次为1~M。
输出
如果输入有解则输出选出的边的权值和否则输出-1
[这题没有样例,题目读起来也感觉很奇怪,代码凭感觉]
#include<iostream>
#include<vector>
#include<set>
#include<bits/stdc++.h>
using namespace std;
struct edge{
int u;
int v;
int d;
};
bool cmp(edge& a,edge& b){
return a.d<b.d;
}
int main(){
int N,M,K;
scanf("%d %d %d",&N,&M,&K);
set<int> arc;
int c;
for(int i=0;i<K;i++){
cin>>c;
arc.insert(c);
}
vector<edge> Edge(M+1);
//输入边信息
for(int i=1;i<=M;i++){
scanf("%d %d %d",&Edge[i].u,&Edge[i].v,&Edge[i].d);
}
sort(Edge.begin(),Edge.end(),cmp);
vector<int> visit(N,0);
//给定的边先连起来
for(int i=1;i<=M;i++){
if(!arc.count(i)){
visit[Edge[i].u]=1;
visit[Edge[i].v]=1;
}
}
int sum=0;
//选择剩余的边,Kruskal 算法
for(int i=1,j=0;i<=M;i++){
int a=Edge[i].u,b=Edge[i].v;
if(!visit[a]||!visit[b]){
visit[a]=1;
visit[b]=1;
if(arc.count(i))
sum+=Edge[i].d;
}
}
for(int i=0;i<N;i++){
if(!visit[i]){
cout<<-1<<endl;
return 1;
}
}
cout<<sum<<endl;
return 1;
}