PAT练习(八)

PAT 1030B/1085A

https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224
测试点4超时,5错误

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
	int n,p,max;
	cin>>n>>p;
	int arr[100010]={0};
	for(int i=0;i<n;i++){
		cin>>arr[i];
	} 
	sort(arr,arr+n);
	max=arr[n-1];
	int maxN=0; 
	for(int i=0;i<n;i++){
		int num=0;
		for(int j=i;j<n;j++){
			if(arr[j]*p>=max){
				num++;
			}
		}
		if(num>maxN) maxN=num;
	}
	cout<<maxN;
	return 0;
}

PAT 1035B 插入与归并 (25 分)/1089A

https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040
测试点5,6错误

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int ori[110],tempOri[110],arr[110],n;
void showA(){
	cout<<tempOri[0];
	for(int i=1;i<n;i++){
		cout<<" "<<tempOri[i];
	}
}
bool res(){
	for(int i=0;i<n;i++){
		if(tempOri[i]!=arr[i]){
			return false;
		}
	} 
	return true;
}
bool insertA(){
	bool flag=false;
	for(int i=1;i<n;i++){
		if(i!=1&&res()){
			flag=true;
		}
		int temp=tempOri[i];
		int j=i;
		while(j>0&&tempOri[j-1]>temp){
				tempOri[j]=tempOri[j-1];
				j--;
		}
		tempOri[j]=temp;
		if(flag==true){
			return true;
		}
	} 
	return false;
}
bool mergeA(){
	bool flag=false;
	for(int i=2;i/2<=n;i+=2){
		if(i!=2&&res()){
			flag=true;
		}
		for(int j=0;j<n;j+=i){
			sort(tempOri+j,tempOri+min(j+i,n));
		}
		if(flag==true){
			showA();
			return true;
		}
	}
	return false;
	
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>ori[i];
		tempOri[i]=ori[i];
	}
	for(int i=0;i<n;i++){
		cin>>arr[i];
	}
	if(insertA()){
		cout<<"Insertion Sort"<<endl;
		showA();
	}
	else{
		cout<<"Merge Sort"<<endl;
		for(int i=0;i<n;i++){
			tempOri[i]=ori[i];
		}
		mergeA();
	}
//	showA();
	return 0;
}在这里插入代码片

PAT 1029A

https://pintia.cn/problem-sets/994805342720868352/problems/994805466364755968
测试点5,7,8运行超时,3答案错误

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	int arr[200010]={0};
	int n,m;
	cin>>n;
	int cnt=0;
	for(int i=0;i<n;i++){
		cin>>arr[i];
	}	
	cin>>m;
	int index=(n+m-1)/2;
//	for(int i=0;i<n;i++){
//		cin>>arr1[i];
//	}
//	int i=0,j=0;
//	while(cnt<index){
//		if(arr[i]<arr1[j]) i++;
//		else j++;
//		cnt++;
//	}
//	if(arr[i]<arr1[j]){
//		cout<<arr[i]<<endl;
//	}
//	else cout<<arr1[j]<<endl;
	int j=0;
	while(cnt<index&&j<m){
		int temp=0,i=0;
		cin>>temp;
		cnt=0;
		for(;i<n;i++){
			if(arr[i]>temp){
				flag=i;
				break;
			}
			cnt++;
		}
		for(int j=n;j>i;j--){
			arr[j]=arr[j-1];
		}
		arr[i]=temp;
		n++;
		j++;
		cnt++;
		
	}
	cout<<arr[index];
	return 0;
}

PAT 1048A Find Coins (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805432256675840
测试点3,4运行超时

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
	int arr[100010]={0};
	int n,m;
	cin>>n>>m;
	bool flag=false;
	for(int i=0;i<n;i++){
		cin>>arr[i];
	}
	sort(arr,arr+n);
	int left=0,right=0;
	for(int i=0;i<n;i++){
		left=arr[i];
		for(int j=i+1;j<n;j++){
			right=arr[j];
			if((left+right)==m){
				flag=true;
				cout<<left<<" "<<right;
				break;
			}
			else if((left+right)>m){
				break;
			}
		}
		if(flag){
			break;
		}
	}
	if(flag==false){
		cout<<"No Solution";
	}
	
	return 0;
}

PAT 1040B 有几个PAT (25 分)/1093A

https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616

在这里插入代码片#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
	int leftP[100010]={0};
	string str;
	getline(cin,str);
	int right=0,rs=0;
	for(int i=0;i<str.length();i++){
		//在上一个的个数基础上进行增加 
		if(i>0){
			leftP[i]=leftP[i-1];
		}
		if(str[i]=='P'){
			leftP[i]+=1;
		}
	}
	//获取右边T的个数,与做左边当前位置已有的P的个数相乘。乘积相加为最终个数 
	for(int i=str.length()-1;i>=0;i--){
		if(str[i]=='T'){
			right+=1;
		}
		else if(str[i]=='A'){
			rs=(rs+leftP[i]*right)%1000000007;
		}
	} 
	cout<<rs; 
	return 0;
} 

PAT 1045B 快速排序 (25 分)/1101A

https://pintia.cn/problem-sets/994805260223102976/problems/994805278589960192
三个测试点运行超时

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	int arr[100010]={0};
	int f[100010]={0};
	int n=0,count=0;
	
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>arr[i];
	}
	for(int i=0;i<n;i++){
		bool flag=true;
		for(int j=0;j<i;j++){
			if(arr[j]>arr[i]){
				flag=false;
				break;
			}
		}
		if(flag){
			for(int j=n-1;j>i;j--){
				if(arr[j]<arr[i]){
					flag=false;
					break;
				}
			}
		}
		if(flag==true){
			f[count]=arr[i];
			count=count+1;	
		}
	}
	if(count>0){
		cout<<count<<endl;
		cout<<f[0];
		for(int i=1;i<count;i++){
			cout<<" "<<f[i];
		}
	}
	else{
		cout<<0<<endl;
		cout<<endl;
	}
	
	
	
	return 0;
}

暴力破解超时,修改

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
	int arr[100010]={0},leftMax[100010]={0},rightMin[100010],rs[100010]={0};
	int n=0,count=0;	
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>arr[i];
	}
	//获取每个位置左边的最大数 
	for(int i=1;i<n;i++){
		leftMax[i]=max(leftMax[i-1],arr[i-1]);
	}
	//获取每个位置右边的最小数 
	rightMin[n-1]=0x3fffffff;
	
	for(int i=n-2;i>=0;i--){
		rightMin[i]=min(rightMin[i+1],arr[i+1]);
	}
	//判断是否为主元 
	for(int i=0;i<n;i++){
		if(leftMax[i]<arr[i]&&rightMin[i]>arr[i]){
			rs[count]=arr[i];
			count=count+1;
		}
	}
	if(count>0){
		cout<<count<<endl;
		cout<<rs[0];
		for(int i=1;i<count;i++){
			cout<<" "<<rs[i];
		}
	}
	else{
		cout<<0<<endl;
		cout<<endl;
	}
	
	
	
	return 0;
}
发布了43 篇原创文章 · 获赞 4 · 访问量 6130

猜你喜欢

转载自blog.csdn.net/didadu/article/details/100067838