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];
}
就过了, 还是不知道为什么.
本文分享了如何通过调整输入方式和优化算法来避免PAT排序题超时问题,重点讨论了`cin`效率低下的现象,并展示了两种关键代码优化策略,包括数组读取优化和时间复杂度控制。





