PAT 练习(七)

贪心相关的总是运行超时,气死了,啊啊啊

PAT1023B 组个最小数 (20 分)

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

#include<cstdio>
#include<iostream>

using namespace std;
int main(){
	int num[10]={0};
	int cnt[10]={0};
	for(int i=0;i<10;i++){
		cin>>cnt[i];
		num[cnt[i]]++;
	}
	//输出第一个数字 
	for(int i=1;i<10;i++){
		if(cnt[i]!=0){
			cout<<i;
			cnt[i]--;
			break;
		}
	}
	//输出后面几个数字
	for(int i=0;i<10;i++){
		while(cnt[i]>0){
			cout<<i;
			cnt[i]--;
		}
	} 
	return 0;
} 

PAT1020B 1020 月饼 (25 分)/1070A

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

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1010;
struct Moon{
	//库存量 
	double cnt;
	//零售价
	double price;
	//总售价
	double sale; 
}cake[maxn];

//比较单价进行排序 
bool cmp(Moon a,Moon b){
	if(a.price != b.price){
		return a.price>b.price;
	}
	else return a.cnt>b.cnt;
}

int main(){
	//n为月饼的种类数,d为市场最大需求 
	int n,d;
	cin>>n>>d;
	for(int i=0;i<n;i++){
		cin>>cake[i].cnt;
	}
	for(int i=0;i<n;i++){
		cin>>cake[i].sale;
		cake[i].price = cake[i].sale/cake[i].cnt;
	}
	sort(cake,cake+n,cmp);
	//出错,检查 
/*	for(int i=0;i<n;i++){
		cout<<cake[i].sale;
	} 
	cout<<endl;
*/
	//int key=0;
	double key = 0;
	for(int i=0;i<n&&d>0;i++){
		if(cake[i].cnt <= d){
			key = key+cake[i].sale;
		}
		else
			key = key+cake[i].price*d;
		d = d-cake[i].cnt; 
	}
	//	cout<<key;
	printf("%.2f",key);
	return 0; 
} 

PAT1033A To Fill or Not to Fill (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805458722734080

在这里插入代码片

PAT1037A Magic Coupon (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805451374313472

#include<cstdio>
#include<iostream>
#include<algorithm> 
using namespace std;
bool cmp(int a,int b){
	return a>b;
}
int main(){
	int arr[100010]={0};
	int arr1[100010]={0};
	int n,m;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>arr[i];
	}
	sort(arr,arr+n,cmp);
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>arr1[i];
	}
	sort(arr1,arr1+m,cmp);
	int sum=0,i=0,j=0;
	for(;i<n&&j<m;i++,j++){
		if(arr[i]>=0&&arr1[j]>=0){
			sum+=arr[i]*arr1[j];
		}
	}
	for(;i>=0&&j>=0;i--,j--){
		if(arr[i]<=0&&arr1[j]<=0){
			sum+=arr[i]*arr1[j];
		}
	}
	cout<<sum;
	return 0;
}

PAT1067A Sort with Swap(0, i) (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805403651522560
未理解

#include <iostream>
using namespace std;
int main() {
    int n, t, cnt = 0, a[100010];
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> t;
        a[t] = i;
    }
    for(int i = 1; i < n; i++) {
        while(i != a[i]) {
            while(a[0] != 0) {
                swap(a[0],a[a[0]]);
                cnt++;
            }
            if(i != a[i]) {
                swap(a[0],a[i]);
                cnt++;
            }
        }
    }
    cout << cnt;
    return 0;
}

PAT1038A Recover the Smallest Number (30 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805449625288704

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> 
using namespace std;
bool cmp(string a,string b){
	return a+b<b+a;
}
int main(){
	string num[10010];
	int n;
	cin>>n;
	string flag;
	for(int i=0;i<n;i++){
		cin>>num[i];
	}
	sort(num,num+n,cmp);
	string str;
	for(int i=0;i<n;i++) str=str+num[i];
	while(str[0]=='0'&&str.length()>1){
		str.erase(str.begin());
	}
	cout<<str;
	return 0;
}

PAT1030B 完美数列 (25 分)/1085A

https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224
第四个测试点运行超时,第五个测试点错误

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

PAT1010A

整道题感觉乱七八糟的,气死了

在这里插入代码片

PAT1044A Shopping in Mars (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805439202443264
测试点2,5运行超时

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main(){
	int num[100010]={0};
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>num[i];
	}	
	int left=0,right=0,sum=0,min=0,index=0;
	bool flag=false;
	for(int i=0;i<n;i++){
		sum=num[i];
		left=i+1;
		if(sum==m){
			cout<<left<<"-"<<left<<endl;
			flag=true;
		}
		else{
			for(int j=i+1;j<n;j++){
				if((sum+num[j])<=m){
					
					sum=sum+num[j];
					right=j+1;	
				}
				else if((sum+num[j])>m){
					
					sum=sum+num[j];	
					right=j+1;			
					break;
				}
				if(sum==m){
					break;
				}
			}
			if(sum==m){
				flag=true;
				cout<<left<<"-"<<right<<endl;
			}
			else if(sum>m){
				if(sum<min||(index==0)){
					index=1;
					min=sum;
				}
			}
		}
	}
	if(!flag){
	for(int i=0;i<n;i++){
		sum=num[i];
		left=i+1;
		if(sum==min){
			cout<<left<<"-"<<left<<endl;
		}
		else{
			for(int j=i+1;j<n;j++){
				if((sum+num[j])<=min){
					
					sum=sum+num[j];
					right=j+1;	
				}
				else if((sum+num[j])>min){
					sum=sum+num[j];	
					right=j+1;			
					break;
				}
				if(sum==min){
					break;
				}
			}
			if(sum==min){
				cout<<left<<"-"<<right<<endl;
			}
	}
	}
}
	
	
	return 0;
}

PAT1048A 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;
}
发布了43 篇原创文章 · 获赞 4 · 访问量 6131

猜你喜欢

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