距离PAT考试还有14天最重要的是做透每一题
(1)思路暴力
会超时
(2)
用hash存储每个数被M减之后的数
注意这里会有重复的值所以要用数组存储其数量
再仔细思考一下,只要用数组存储每个数的数量即可,遍历的时候判断该数组v[M-i]元素的值是否大于1
#include <cstdio> #include <cstring> using namespace std; int num[1010],N,M; int main() { scanf("%d %d",&N,&M); memset(num,0,sizeof(num)); for(int i=0;i<N;i++) { int temp; scanf("%d",&temp); num[temp]++; } for(int i=1;i<500;i++) { if(num[i]) { num[i]--; if(num[M-i]) { printf("%d %d\n",i,M-i); return 0; } num[i]++; } } printf("No Solution"); return 0; }
未简化时的代码
#include <cstdio> #include <map> #include <vector> #include <algorithm> #include <cstring> using namespace std; int n,m,flag[1000000]; int main() { scanf("%d %d",&n,&m); vector<int> va; map<int,int> ha; memset(flag,0,sizeof(flag)); for(int i=0;i<n;i++) { int v; scanf("%d",&v); flag[v]++; ha[v]=m-v; va.push_back(v); } sort(va.begin(),va.end()); int res=0; for(int i=0;i<n;i++) { if(ha[va[i]] == va[i]) { if(flag[va[i]] > 1) { res=va[i]; break; } else continue; } if(ha.find(ha[va[i]]) != ha.end()) { res=va[i]; break; } } if(res == 0) printf("No Solution"); else printf("%d %d",res,m-res); return 0; }