int Kminselect(int a[],int s,int t,int k)
{
int n = t + 1;
for(int i = 0;i < n;i ++)
{
int l = i;
for(int j = i + 1;j < n;j ++){
if(a[l] > a[j]){
l = j;
}
}
int ll = a[i];
a[i] = a[l];
a[l] = ll;
}
return a[k - 1];
}
6-22 最大次大问题(分治法) (10 分)
void max1max2(int a[],int low,int high,int &max1,int &max2)
{
int n = high + 1;
for(int i = 0;i < n;i ++)
{
int l = i;
for(int j = i + 1;j < n;j ++){
if(a[l] > a[j]){
l = j;
}
}
int ll = a[i];
a[i] = a[l];
a[l] = ll;
}
max1 = a[n - 1];
max2 = a[n - 2];
}
6-23 二分查找 (15 分)
int BinarySearch(int a[], const int x, int n)
{
int l = 0,r = n - 1;
while(l < r){
int mid = l + r>> 1;
if(a[mid] >= x){
r = mid;
}else{
l = mid + 1;
}
}
if(a[l] != x) return -1;
return l;
}
6-24 求自定类型元素序列的中位数 (25 分)
ElementType Median(ElementType A[], int N){
ElementType Temp;
for (int gap = N / 2; gap > 0; gap /= 2){ //gap是每次排序分组的间隔,每次间隔缩小两倍(其他缩小办法也可以)
for (int i = gap; i < N; i++){//相当于在同一组内采用直接插入排序
for (int j = i - gap; j >= 0 && A[j]> A[j + gap]; j -= gap){//如果同一组内前一个元素大于相 gap个位置的元素,则两者交换位置
Temp = A[j];
A[j] = A[j + gap];
A[j + gap] = Temp;
}
}
}
return A[N / 2];//返回中间元素
}
6-25 大整数乘法(运算符重载) (25 分)
/* 请在这里填写答案 */
class BigInteger{
private:
int big[2010];
string a;
public:
BigInteger(string ba=""){
a=ba;
for (int i = 0; i <2010 ; ++i) {
big[i]=0;
}
}
friend istream& operator>>(istream& inbig,BigInteger& bg);
friend ostream& operator<<(ostream& outbig,BigInteger& bg);
BigInteger operator*(BigInteger& bg){
BigInteger rsBig;
int jw=0,lc,sc;
int la=this->a.size();
int lb= bg.a.size();
if(la==1&&stoi(this->a)==0||lb==1&&stoi(bg.a)==0){
rsBig.a="0";
return rsBig;
}
sc=la+lb-1;
for (int i =la-1; i >=0 ; --i) {
lc=sc;
sc--;
for (int j =lb-1; j >=0; --j) {
rsBig.big[lc--]+=(jw+this->big[i]*bg.big[j])%10;
jw=(jw+this->big[i]*bg.big[j])/10;
}
rsBig.big[lc]=jw;
jw=0;
}
jw=0;
int x=0;
for (int k = la+lb-1; k >=0; --k) {
x=(jw+rsBig.big[k])/10;
rsBig.big[k]=(jw+rsBig.big[k])%10;
jw=x;
}
int begin=(0==rsBig.big[0]?1:0);
int st=0;
rsBig.a.resize(la+lb+2);
for (int l = begin; l < la+lb; ++l) {
rsBig.a[st++]=rsBig.big[l]+'0';
}
rsBig.a[st]='\n';
return rsBig;
}
};
istream& operator>>(istream& inbig,BigInteger& bg){
inbig>>bg.a;
for (int i = 0; i <bg.a.size() ; ++i) {
bg.big[i]=bg.a[i]-'0';
}
return inbig;
}
ostream& operator<<(ostream& outbig,BigInteger& bg){
outbig<<bg.a;
return outbig;
}
7-21
// 我自己写的代码,不优美但是应该没啥问题
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
string str;
for(int i = 1;i <= n;i ++){
str += i + '0';
}
do
{
cout << str << endl;
} while (next_permutation(str.begin(), str.end()));
}
7-22
// 我自己写的代码,不优美但是应该没啥问题
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
set<int>s1,s2;
cin >> n >> m;
for(int i = 0;i < n;i ++){
int x;
cin >> x;
s1.insert(x);
}
for(int i = 0;i < m;i ++){
int x;
cin >> x;
if(s1.count(x)){
s2.insert(x);
}
}
cout << s2.size() << endl;
bool flag = false;
for(auto &x : s2){
if(flag) cout << ' ';
flag = true;
cout << x;
}
return 0;
}
7-23
#include <iostream>
using namespace std;
#include <vector>
struct Node{
int data;
Node*next;
};
int main()
{
int n, m;
cin >> n >> m;
vector<int>res;
Node * first = new Node;
//first->next =nullptr;
Node *pre = new Node;
Node * p = new Node;
pre = first;
pre->next = p;
p = first;
if (n){
pre->data = 1;
}
for (int i = 2; i <= n; i++)
{
Node * pc = new Node;
pc->data = i;
pc->next = nullptr;
p->next = pc;
p = pc;
}
p->next = pre;
//cout << "pre->data = " << pre->data <<"p->next = "<<p->data<< endl;
int cnt = 1;
for (auto i = pre,j = p;n; i = i->next)
{
if (cnt == m)
{
auto pr = i;
res.push_back(i->data);
//cout << i->data << " ";
j->next = i->next;
//delete pr;
n--;
cnt = 0;
}
cnt++;
j = i;
//system("pause");
}
bool tf = false;
for (auto &x : res)
{
if (tf)
cout << " ";
cout << x;
tf = true;
}
system("pause");
return 0;
}
7-24 二分查找 (20 分)
#include <bits/stdc++.h>
using namespace std;
const int N = 1100;
int a[N];
int main()
{
int n;
cin >> n;
for(int i =0;i < n;i ++){
cin >> a[i];
}
int x;
cin >> x;
int l = 0,r = n - 1;
int cnt = 0;
while(l < r){
int mid = l + r + 1 >> 1;
cnt ++;
if(a[mid] > x){
r = mid - 1;
}else{
l = mid;
}
}
if(a[l] != x) l = -1;
cout << l << endl;
cout << cnt << endl;
return 0;
}
7-25 两个有序序列的中位数 (25 分)
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
int b[N];
int c[N];
int main()
{
int n;
cin >> n;
for(int i = 0;i < n;i ++){
cin >> a[i];
}
for(int i = 0;i < n;i ++){
cin >> b[i];
}
int cnt = 0;
int i,j;
for(i = 0,j = 0;i < n && j < n;)
{
if(a[i] > b[j]){
c[cnt ++] = b[j];
j ++;
}else{
c[cnt ++] = a[i];
i ++;
}
}
for(int k = i;k < n;k ++){
c[cnt ++] = a[k];
}
for(int k = j;k < n;k ++){
c[cnt ++] = b[k];
}
/* for(int i = 0;i < cnt;i ++){
cout << c[i] << ' ';
}*/
cout << c[(n * 2 - 1) >> 1] << endl;
return 0;
}
7-26
#include <bits/stdc++.h>
using namespace std;
const int N = 11;
pair<char,char>tree[N];
int din[N];
vector<int> vec;
void bfs(int p)
{
queue<int>q;q.push(p);
while(q.size())
{
p = q.front();q.pop();
if(tree[p].first == '-' && tree[p].second == '-'){
vec.push_back(p);
}
if(tree[p].first != '-'){
int t = tree[p].first - '0';
q.push(t);
}
if(tree[p].second != '-'){
int t = tree[p].second - '0';
q.push(t);
}
}
}
int main()
{
int n;
cin >> n;
for(int i = 0;i < n;i ++)
{
char l,r;
cin >> l >> r;
tree[i].first = l;
tree[i].second = r;
if(l != '-'){
int t = l - '0';
din[t] ++;
}
if(r != '-'){
int t = r - '0';
din[t] ++;
}
}
int root = 0;
for(int i = 0;i < n;i ++){
if(din[i] == 0) root = i;
}
bfs(root);
for(int i = 0;i < vec.size();i ++){
if(i == vec.size() - 1){
cout << vec[i] << endl;
}else{
cout << vec[i] << ' ';
}
}
return 0;
}
7-27
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
vector<int>vec,ans;
LL sum = 1,sum2 = 1;
LL x;
while(cin >> x){
if(x == 0){
if(vec.size() == 0) break;
int t = vec[vec.size() - 1];
vec.pop_back();
sum = sum / t;
continue;
}
sum = sum * x;
vec.push_back(x);
if(sum2 < sum){
sum2 = sum;
ans = vec;
int l = 0,r = ans.size() - 1;
vector<int>b;
for(int i = 0;i <= r;i ++){
if(ans[i] != 1){
l = i;
break;
}
}
for(int i = r;i > l;i --){
if(ans[i] != 1){
r = i;
break;
}
}
for(int i = l;i <= r;i ++){
b.push_back(ans[i]);
}
ans = b;
}
else if(sum2 == sum){
if(vec.size() < ans.size()){
ans = vec;
}
int l = 0,r = ans.size() - 1;
vector<int>b;
for(int i = 0;i <= r;i ++){
if(ans[i] != 1){
l = i;
break;
}
}
for(int i = r;i > l;i --){
if(ans[i] != 1){
r = i;
break;
}
}
for(int i = l;i <= r;i ++){
b.push_back(ans[i]);
}
ans = b;
}
}
cout << sum2 << endl;
int l = 0,r = ans.size() - 1;
vector<int>b;
for(int i = 0;i <= r;i ++){
if(ans[i] != 1){
l = i;
break;
}
}
for(int i = r;i > l;i --){
if(ans[i] != 1){
r = i;
break;
}
}
for(int i = l;i <= r;i ++){
b.push_back(ans[i]);
}
ans = b;
for(auto &x : ans){
cout << x << ' ';
}
return 0;
}
/*
1 2 0 3 0 4 0 0 0
*/