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;
}