关于 A1025 PAT Ranking 第四个点 运行超时 的小发现 以及 codeup第四章递归c题 的小发现

本文分享了如何通过调整输入方式和优化算法来避免PAT排序题超时问题,重点讨论了`cin`效率低下的现象,并展示了两种关键代码优化策略,包括数组读取优化和时间复杂度控制。

1. 准备pat时做到一题排序题 传送门, 运行超时

  • 小发现: 读入用cin 读入数组比 直接 读入一个变量要慢很多, 不知道是为什么, 也不知道分析是否正确, 欢迎讨论!
  • 限时300ms(不知道通过题给 时间分析所需算法的时间复杂度欸, 欢迎大佬留言)
    题干就自行阅读吧,
    给出我一开始的代码
#include <bits/stdc++.h>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define fori(i,x,y) for(int i=(x); i<(y); i++)
#define rep(i,y,x) for(int i=(y); i>=(x); i--)
#define debug(a) cout << #a << ": " << a << endl
#define FAST ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
const int N = 2e5+10;
const int MAX = 3e4+7;
const int inf = 1e9;
ll n,sum,res,cnt,ans;
ll arr[MAX];
ll vis[MAX];
int ni[MAX];
struct node{
	char id[15];
	int score;
	int final_rank;
	int loca_num;
	int loca_rank;
}info[MAX];

string s,str;
bool cmp(node n1, node n2){
	if(n1.score!=n2.score) return n1.score > n2.score;
	else return strcmp(n1.id, n2.id) < 0 ;
}
int main(void){
	FAST;
	cin >> n;
	int cnt = 0;
	ni[0] = 0;
	For(i,1,n){
	    int m;
		cin >> ni[i]; /*看这里*/
		for(int j=0; j<ni[i]/*看这里*/; j++){  
			cin >> info[cnt].id >> info[cnt].score;
			info[cnt].loca_num = i;
			cnt++;
		}
		int first = ni[i-1];/*看这里*/
		sort(info+first/*看这里*/,info+cnt,cmp);
		info[first/*看这里*/].loca_rank = 1;
		for(int j=1; j<ni[i]/*看这里*/; j++){
            if(info[first/*看这里*/+j].score == info[first/*看这里*/+j-1].score){
                info[first/*看这里*/+j].loca_rank=info[first/*看这里*/+j-1].loca_rank;
            } else {
                info[first/*看这里*/+j].loca_rank=j+1;
            }
		}
	//	for(int j=0; j<cnt; j++) debug(info[j].loca_rank);
	}
	sort(info,info+cnt,cmp);
	cout <<cnt << endl;
	int r = 1;
	for(int j=0; j<cnt; j++){
        if(j>0&&info[j].score != info[j-1].score){
            r= j+1;
        }
        cout  << info[j].id << " " <<  r <<" " <<
        info[j].loca_num << " " << info[j].loca_rank << endl;
    }
}

在这里插入图片描述
特别注意下数组ni[ ] 和 first
替换为了这个, 然后过了

For(i,1,n){
	    int m;
		cin >> m;//ni[i]
		for(int j=0; j<m; j++){//ni[i]
			cin >> info[cnt].id >> info[cnt].score;
			info[cnt].loca_num = i;
			cnt++;
		}
		//int first = ni[i-1];
		sort(info+cnt-m,info+cnt,cmp);  // cnt -m <-first
		info[cnt-m].loca_rank = 1;      // cnt -m <-first
		for(int j=1; j<m; j++){         // m <- ni[i]
            if(info[cnt-m+j].score == info[cnt-m+j-1].score){//cnt-m<-first
                info[cnt-m+j].loca_rank=info[cnt-m+j-1].loca_rank;
            } else {
                info[cnt-m+j].loca_rank=j+1;
            }
		}
	//	for(int j=0; j<cnt; j++) debug(info[j].loca_rank);
	}

2. 做codeup的时候C题, 时间超时了, 代码里

#include<bits/stdc++.h>

#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define debug(a) cout << #a << ": " << a << endl
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
const int MAX = 2e6+7;
int n,m;
int arr[MAX];
int vis[MAX];
int sum = 0,cnt=0;
void generateP(int num){
	if(sum==0){
		cnt++;
		return;
	}
	for(int i=num; i<n; i++){
		if( sum - arr[i] >= 0 ){
			sum-=arr[i];
			generateP(i+1);
			sum+=arr[i];
		}
	}
}

int main(void){
	FAST;
	while(scanf("%d",&n) != EOF){ // 看这里 看这里
		for(int i=0; i<n; i++){
			cin >> arr[i];
		}
		sort(arr,arr+n);
		cnt = 0,sum = 40;
		generateP(0);
		cout << cnt << endl;
	}
}

while(scanf("%d",&n) != EOF){ // 看这里 看这里
		for(int i=0; i<n; i++){
			cin >> arr[i];
		}

替换为

while(cin >>n){
		for(int i=0; i<n; i++){
			cin >> arr[i];
		}

就过了, 还是不知道为什么.

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值