P99
#include<iostream>
using namespace std;
const int n = 8;
int a[n] = {8,7,6,5,4,3,2,1};
void selectSort();
int main(){
selectSort();
for(int i = 0; i < n; i++){
printf("%d ",a[i]);
}
return 0;
}
void selectSort(){
for(int i = 0; i < n; i++){
int k = i;
for(int j = i; j < n; j++){
if(a[j] < a[k]){
k = j;
}
}
int temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
P101
#include<iostream>
using namespace std;
const int n = 8;
int a[n] = {8,7,6,5,4,3,2,1};
void insertSort();
int main(){
insertSort();
for(int i = 0; i < n; i++){
printf("%d ",a[i]);
}
return 0;
}
void insertSort(){
for(int i = 1; i < n; i++){
int j = i,temp = a[j];
while(j > 0 && temp < a[j-1]){
a[j] = a[j-1];
j--;
}
a[j] = temp;
}
}
P105
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Student {
char id[15];
int score;
int location_number;
int local_rank;
}stu[30010];
bool cmp(Student a, Student b){
if(a.score != b.score){
return a.score > b.score;
}else{
return a.id < b.id;
}
}
int main(){
int n,k,num = 0;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&k);
for(int j = 0; j < k; j++){
scanf("%s %d",stu[num].id,&stu[num].score);
stu[num].location_number = i;
num++;
}
sort(stu + num - k, stu + num, cmp);
stu[num - k].local_rank = 1; //第一种排名法
for(int j = num - k + 1; j < num; j++){ //
if(stu[j].score == stu[j - 1].score){ //
stu[j].local_rank = stu[j - 1].local_rank; //
}else{ //
stu[j].local_rank = j + 1 - (num - k); //
} //
}
}
sort(stu, stu + num, cmp);
printf("%d\n",num);
int r = 1; //第二种排名法
for(int i = 0; i < num; i++){ //
if(i > 0 && stu[i].score != stu[i - 1].score){ //
r = i + 1; //
} //
printf("%s %d %d %d\n",stu[i].id,r,stu[i].location_number,stu[i].local_rank);
}
return 0;
}
P107(1)
#include<iostream>
using namespace std;
const int maxn = 10010;
bool hashTable[maxn] = {false};
int main(){
int n,m,x;
scanf("%d %d",&n,&m);
for(int i = 0; i < n; i++){
scanf("%d",&x);
hashTable[x] = true;
}
for(int i = 0; i < m; i++){
scanf("%d",&x);
if(hashTable[x] == true){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
P107(2)
#include<iostream>
using namespace std;
const int maxn = 10010;
int hashTable[maxn] = {0};
int main(){
int n,m,x;
scanf("%d %d",&n,&m);
for(int i = 0; i < n; i++){
scanf("%d",&x);
hashTable[x]++;
}
for(int i = 0; i < m; i++){
scanf("%d",&x);
printf("%d\n",hashTable[x]);
}
return 0;
}
P110
#include<iostream>
using namespace std;
const int maxn = 100;
char S[maxn][5], temp[5];
int hashTable[26 * 26 * 26 + 10] = {0};
int hashFunc(char S[], int len){
int id = 0;
for(int i = 0; i < len; i++){
id = id * 26 + (S[i] - 'A');
}
return id;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i = 0; i < n; i++){
scanf("%s",S[i]);
int id = hashFunc(S[i], 3);
hashTable[id]++;
}
for(int i = 0; i < m; i++){
scanf("%s",temp);
int id = hashFunc(temp, 3);
printf("%d",hashTable[id]);
}
return 0;
}
P112
#include<iostream>
using namespace std;
int F(int n){
if(n == 0){
return 1;
}else{
return F(n-1)*n;
}
}
int main(){
int n;
scanf("%d",&n);
printf("%d",F(n));
return 0;
}
P114
#include<iostream>
using namespace std;
int F(int n){
if(n == 0 || n==1){
return 1;
}else{
return F(n-2) + F(n-1);
}
}
int main(){
int n;
scanf("%d",&n);
printf("%d",F(n));
return 0;
}
P115
#include<iostream>
using namespace std;
const int maxn = 11;
int n,P[maxn],hashTable[maxn] = {false};
void generateP(int index){
if(index == n + 1){
for(int i = 1; i <= n; i++){
printf("%d ",P[i]);
}
printf("\n");
return;
}
for(int i = 1; i <= n; i++){
if(hashTable[i] == false){
P[index] = i;
hashTable[i] = true;
generateP(index + 1);
hashTable[i] = false;
}
}
}
int main(){
n = 3;
generateP(1);
return 0;
}
P116
#include<iostream>
#include<math.h>
using namespace std;
int count = 0;
const int maxn = 11;
int n,P[maxn],hashTable[maxn] = {false};
void generateP(int index){
if(index == n + 1){
bool flag = true;
for(int i = 1; i <= n; i++){
for(int j = i + 1; j <= n; j++){
if(abs(i - j) == abs(P[i] - P[j])){
flag = false;
}
}
}
if(flag){
count++;
}
return;
}
for(int x = 1; x <= n; x++){
if(hashTable[x] == false){
P[index] = x;
hashTable[x] = true;
generateP(index + 1);
hashTable[x] = false;
}
}
}
int main(){
n = 8;//n皇后问题 此时 n = 8
generateP(1);
printf("%d",count);
return 0;
}
P117
#include<iostream>
#include<math.h>
using namespace std;
int count = 0;
const int maxn = 11;
int n,P[maxn],hashTable[maxn] = {false};
void generateP(int index){
if(index == n + 1){
count++;
return;
}
for(int x = 1; x <= n; x++){
if(hashTable[x] == false){
int flag = true;
for(int pre = 1; pre < index; pre++){
if(abs(pre - index) == abs(P[pre] - x)){
flag = false;
break;
}
}
if(flag){
P[index] = x;
hashTable[x] = true;
generateP(index + 1);
hashTable[x] = false;
}
}
}
}
int main(){
n = 8;
generateP(1);
printf("%d",count);
return 0;
}
P120
#include<iostream>
#include<algorithm>
using namespace std;
struct mooncake{
double store;
double sell;
double price;
}cake[1010];
bool cmp(mooncake a, mooncake b){
return a.price>b.price;
}
int main(){
int n;
double D;
scanf("%d %lf",&n,&D);
for(int i = 0; i < n; i++){
scanf("%lf",&cake[i].store);
}
for(int i = 0; i < n; i++){
scanf("%lf",&cake[i].sell);
cake[i].price = cake[i].sell / cake[i].store ;
}
sort(cake, cake + n, cmp);
double ans = 0;
for(int i = 0; i < n; i++){
if(cake[i].store <= D){
D -= cake[i].store;
ans += cake[i].sell;
}else{
ans += D * cake[i].price;
break;
}
}
printf("%.2f\n",ans);
return 0;
}
P121
#include<iostream>
using namespace std;
int main(){
int count[10];Y
for(int i = 0; i < 10; i++){
scanf("%d",&count[i]);
}
for(int i = 1; i < 10; i++){
if(count[i] > 0){
printf("%d",i);
count[i]--;
break;
}
}
for(int i = 0; i < 10; i++){
for(int j = 0; j < count[i]; j++){
printf("%d",i);
}
}
return 0;
}
P122
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 110;
struct Inteval{
int x,y;
}I[maxn];
bool cmp(Inteval a, Inteval b){
if(a.x != b.x){
return a.x > b.x;
}else{
return a.y < b.y;
}
}
int main(){
int n;
while(scanf("%d",&n), n != 0){
for(int i = 0; i < n; i++){
scanf("%d %d",&I[i].x,&I[i].y);
}
sort(I, I + n, cmp);
int ans = 1, lastX = I[0].x;
for(int i = 1; i < n; i++){
if(I[i].y <= lastX){
ans++;
lastX = I[i].x;
}
}
printf("%d\n",ans);
}
return 0;
}
P126(递归)
#include<iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int x){
if(left <= right){
int mid = (right + left) / 2;
if(x == A[mid]){
return mid;
}else if(x < A[mid]){
return binarySearch(A, left, mid - 1, x);
}else{
return binarySearch(A, mid + 1, right, x);
}
}else{
return -1;
}
}
int main(){
const int n = 10;
int A[n] = {1, 3, 4, 6, 7, 8, 10, 11, 12, 15};
printf("%d %d",binarySearch(A, 0, n - 1, 6),binarySearch(A, 0, n - 1, 9));
return 0;
}
P126
#include<iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int x){
int mid;
while(left <= right){
mid = left + (right - left) / 2;
if(A[mid] == x){
return mid;
}else if(A[mid] > x){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
int main(){
const int n = 10;
int A[n] = {1, 3, 4, 6, 7, 8, 10, 11, 12, 15};
printf("%d %d",binarySearch(A, 0, n - 1, 6),binarySearch(A, 0, n - 1, 9));
return 0;
}
P128~129
#include<iostream>
using namespace std;
int lower_bound(int A[], int left, int right, int x){
int mid;
while(left < right){
mid = left + (right - left) / 2;
if(A[mid] >= x){
right = mid;
}else{
left = mid + 1;
}
}
return left;
}
int upper_bound(int A[], int left, int right, int x){
int mid;
while(left < right){
mid = left + (right - left) / 2;
if(A[mid] > x){
right = mid;
}else{
left = mid + 1;
}
}
return left;
}
int main(){
const int n = 5;
int A[n] = {1, 3, 3, 3, 6};
printf("%d %d",lower_bound(A, 0, n, 3),upper_bound(A, 0, n, 3));//以3为例
return 0;
}
P131
#include<iostream>
#include<math.h>
using namespace std;
const double eps = 1e-5;
double f(double x){
return x * x;
}
double calSqrt(){
double left = 1 , right = 2 , mid;
while(right - left > eps){
mid = (right - left) / 2 + left;
if(f(mid) > 2){
right = mid;
}else{
left = mid;
}
}
return mid;
}
int main(){
printf("%lf",calSqrt());
return 0;
}
p133
#include<iostream>
#include<math.h>
using namespace std;
const double eps = 1e-5;
const double PI = acos(-1.0);
double f(double R, double h){
double alpha = 2 * acos((R - h) / R);
double L = 2 * sqrt(R * R - (R - h) * (R - h));
double S2 = PI * R * R / 2;
double S1 = alpha * R * R / 2 - (R - h) * L / 2;
return S1 / S2;
}
double solve(double R, double r){
double left = 0, right = R, mid;
while(right - left > eps){
mid = (left + right) / 2;
if(f(R,mid) > r){
right = mid;
}else{
left = mid;
}
}
return mid;
}
int main(){
double R, r;
scanf("%lf %lf", &R, &r);
printf("%lf",solve(R,r));
return 0;
}
P135
P138
#include<iostream>
using namespace std;
int a[6] = {1, 2, 3, 4, 5, 6};
int M = 8;
int main(){
int ans = 0, i = 0, j = 5;
while(i < j){
if(a[i] + a[j] == M){
ans++;
printf("%d %d %d\n", a[i], a[j], ans);
i++;
j--;
}else if(a[i] + a[j] < M){
i++;
}else{
j--;
}
}
printf("%d",ans);
return 0;
}
P139
#include<iostream>
using namespace std;
int A[5] = {1, 3, 5, 7, 8}, B[5] = {2, 4, 6, 9, 10}, C[10000];
int merge(int A[], int B[], int C[],int m,int n){
int i = 0, j = 0, index = 0;
while(i < n && j < m){
if(A[i] <= B[j]){
C[index++] = A[i++];
}else{
C[index++] = B[j++];
}
}
while(i < n){
C[index++] = A[i++];
}
while(j < m){
C[index++] = B[j++];
}
return index;
}
int main(){
int max = merge(A, B, C, 5, 5);
for(int i = 0; i < max; i++){
printf("%d ",C[i]);
}
return 0;
}
P140
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[10]={10,9,8,7,6,5,4,3,2,1};
void merge(int a[],int l1,int r1,int l2,int r2){//将两个相邻的段按顺序合成一个新的段
int i=l1,j=l2,num=0;
int temp[1000];
while(i<=r1&&j<=r2){
if(a[i]<=a[j]){
temp[num++]=a[i++];
}else{
temp[num++]=a[j++];
}
}
while(i<=r1){
temp[num++]=a[i++];
}
while(j<=r2){
temp[num++]=a[j++];
}
for(int i=0;i<num;i++){
a[l1++]=temp[i];
}
}
void select(int a[],int l,int r){
if(l<r){
int mid=(l+r)/2;
select(a,l,mid);
select(a,mid+1,r);
merge(a,l,mid,mid+1,r);
}
}
int main(){
select(a,0,9);
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}
P141
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[10]={10,9,8,7,6,5,4,3,2,1};
void merge(int a[],int l1,int r1,int l2,int r2){//将两个相邻的段按顺序合成一个新的段
int i=l1,j=l2,num=0;
int temp[1000];
while(i<=r1&&j<=r2){
if(a[i]<=a[j]){
temp[num++]=a[i++];
}else{
temp[num++]=a[j++];
}
}
while(i<=r1){
temp[num++]=a[i++];
}
while(j<=r2){
temp[num++]=a[j++];
}
for(int i=0;i<num;i++){
a[l1++]=temp[i];
}
}
void select(int a[],int n){
for(int step=2;step/2<=n;step*=2){//左边一半元素大于n时即可退出
for(int j=0;j<n;j+=step){
int mid=j+step/2-1;//j到mid有step/2个元素
if(mid+1<=n){
int k=0;
if(n<j+step-1){//寻找此时两个段的最右元素 因为在处理最右边的两个段时 右半<=左半
k=n;
}else{
k=j+step-1;
}
merge(a,j,mid,mid+1,k);//两个段有序合并
}
}
}
}
int main(){
select(a,9);//从0开始操作故为9
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}
P143
#include<stdio.h>
int a[10]={10,9,8,7,6,5,4,3,2,1};
int part(int a[],int l,int r){
int temp=a[l];
while(l<r){
while(a[r]>temp&&l<r){
r--;
}
a[l]=a[r];
while(a[l]<=temp&&l<r){
l++;
}
a[r]=a[l];
}
a[l]=temp;
return l;
}
void quicksort(int a[],int l,int r){
if(l<r){
int pos=part(a,l,r);
quicksort(a,l,pos-1);
quicksort(a,pos+1,r);
}
}
int main(){
quicksort(a,0,9);
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}
P144
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
srand((unsigned)time(NULL));
for(int i=0;i<7;i++){
printf("%d ",rand());
}
return 0;
}
P145(1)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
srand((unsigned)time(NULL));
int a,b;
scanf("%d %d",&a,&b);
for(int i=0;i<7;i++){
printf("%d ",rand()%(b-a+1)+a);
}
return 0;
}
P145(2)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int main(){
srand((unsigned)time(NULL));
int a,b;
scanf("%d %d",&a,&b);
for(int i=0;i<7;i++){
printf("%d ",(int)(round(1.0*rand()/RAND_MAX*(b-a)))+a);//round为四舍五入函数
}
return 0;
}
P146
#include<iostream>
#include<time.h>
#include<math.h>
using namespace std;
int a[10]={10,9,8,7,6,5,4,3,2,1};
int part(int a[],int l,int r){
int p=(round(1.0*rand()/RAND_MAX*(r-l)+l));
swap(a[l],a[p]);
int temp=a[l];
while(l<r){
while(a[r]>temp&&l<r){
r--;
}
a[l]=a[r];
while(a[l]<=temp&&l<r){
l++;
}
a[r]=a[l];
}
a[l]=temp;
return l;
}
void quicksort(int a[],int l,int r){
if(l<r){
int pos=part(a,l,r);
quicksort(a,l,pos-1);
quicksort(a,pos+1,r);
}
}
int main(){
srand((unsigned)time(NULL));
quicksort(a,0,9);
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}
P148
#include<iostream>
#include<string.h>
using namespace std;
const int MAXN = 100010;
const int MOD = 1000000007;
char str[MAXN];
int leftNumP[MAXN] = {0};
int main(){
gets(str);
int len = strlen(str);
for(int i = 0; i < len; i++){
if(i > 0){
leftNumP[i] = leftNumP[i - 1];
}
if(str[i] == 'P'){
leftNumP[i]++;
}
}
int ans = 0, rightNumT = 0;
for(int i = len - 1; i >= 0; i--){
if(str[i] == 'T'){
rightNumT++;
}else if(str[i] == 'A'){
ans = (ans + leftNumP[i] * rightNumT) % MOD;
}
}
printf("%d\n",ans);
return 0;
}
P149
#include<iostream>
#include<time.h>
#include<math.h>
using namespace std;
int randPartition(int A[],int left,int right){
int p=(round(1.0*rand()/RAND_MAX*(right-left)+left));
swap(A[p],A[left]);
int temp=A[left];
while(left<right){
while(left<right&&A[right]>temp){
right--;
}
A[left]=A[right];
while(left<right&&A[left]<temp){
left++;
}
A[right]=A[left];
}
A[left]=temp;
return left;
}
int randSelect(int A[],int left,int right,int K){
if(left==right){
return A[left];
}
int p=randPartition(A,left,right);
int M=p-left+1;
if(M==K){
return A[p];
}else if(K<M){
return randSelect(A,left,p-1,K);
}else{
return randSelect(A,p+1,right,K-M);
}
}
int main(){
int A[10]={5,6,8,7,9,3,1,2,4,0};
int x=10;//查找在A数列中第x大的数 x=1 输出0 x=2 输出1 x=10 输出9
printf("%d",randSelect(A,0,9,x));
return 0;
}
P150
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100010;
int A[maxn],n;
int randPartition(int A[],int left,int right){
int p=(round(1.0*rand()/RAND_MAX*(right-left)+left));
swap(A[p],A[left]);
int temp=A[left];
while(left<right){
while(left<right&&A[right]>temp){
right--;
}
A[left]=A[right];
while(left<right&&A[left]<temp){
left++;
}
A[right]=A[left];
}
A[left]=temp;
return left;
}
void randSelect(int A[],int left,int right,int K){
if(left==right){
return;
}
int p=randPartition(A,left,right);
int M=p-left+1;
if(M==K){
return;
}else if(K<M){
randSelect(A,left,p-1,K);
}else{
randSelect(A,p+1,right,K-M);
}
}
int main(){
srand((unsigned)time(NULL));
int sum=0,sum1=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&A[i]);
sum+=A[i];
}
randSelect(A,0,n-1,n/2);
for(int i=0;i<n/2;i++){
sum1+=A[i];
}
printf("%d",(sum-sum1)-sum1);
return 0;
}