PAT的总结,c++的st考点多且比较灵活,数据输入输出麻烦,思维跳跃,阅读理解很重要,题干长,一定要理清题的细节和思路;
第一题
思路:预处理所有平均数 ,判断每一组数据是否都满足
优化:代替我最开始判断每一个数是否满足,
#include <bits/stdc++.h> #define int long long using namespace std; const int N=30000; int n,t; int a[N],b[N]; map<int,int>q; void solve() { int m; cin>>m; for(int i=1;i<=m;i++)cin>>b[i]; for(int i=1;i<=m;i++) { if(q[b[i]*4]==0) { cout<<"No"<<endl; return ; } } cout<<"Yes"<<endl; } signed main() { cin>>n>>t; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j+1;k<=n;k++) for(int x=k+1;x<=n;x++) { int ans=a[i]+a[j]+a[k]+a[x]; q[ans]++; } while(t--) { solve(); } return 0; }
第二题
知识点:结构体排序比较的优化,map的键对值;判断连续的数 (重要)
#include <bits/stdc++.h> using namespace std; struct node{double x,y,v; }; bool cmp(node x,node y){ return x.x!=y.x?x.x<y.x:x.y<y.y; } map<double,vector<node>>mp; int main() { int n; cin>>n; int sum=0,cnt=0; for(int i=1;i<=n;i++) { double x,y,v; cin>>x>>y>>v; sum+=v; mp[y/x].push_back(node{x,y,v}); } for(auto i:mp) { vector<node>vc=i.second; sort(vc.begin(),vc.end(),cmp); for(int i=0;i<vc.size();i++)//去掉连续1的打的次数 { if(i==0||vc[i].v!=1||vc[i-1].v!=1) cnt++; } } cout<<sum<<' '<<cnt<<endl; return 0; }