题目不赘述,在pta教育超市中可以买到。https://pintia.cn/problem-sets/1446838676759703552/exam/problems/1446838732288094208
一.懂得都懂
用深度优先遍历先预处理,之后按照要求找答案即可。
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[60];
map<int,int> mp;
void dfs(int u,int num,int sum){
if(num==4){
mp[sum]=1;
return;
}
if(u==n+1)return;
//2.
dfs(u+1,num,sum);
//1.
dfs(u+1,num+1,sum+a[u]);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
dfs(1,0,0);
while(k--){
int m;
cin>>m;
bool flag=true;
for(int i=1;i<=m;i++){
int temp;
cin>>temp;
if(!mp[temp*4]){
flag=false;
//break;
}
}
if(flag)puts("Yes");
else puts("No");
}
return 0;
}
二.芬兰木棋
使用斜率存储每条直线上的点,按照题目要求遍历每一条直线上的点。(如果难以理解,可以分四个象限使用斜率存储射线)
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,w;
};
unordered_map<double,vector<node> > mp;
bool cmp(node a,node b){
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}