A.打表可得答案是小于等于n的第一个质数,要特判1和4
然后判定质数那里偷的队长模板所以勉强能过
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N = 1e7+10;
int n,m;
int primes[N];
int cnt;
bool st[N];
unordered_map<int,int> mp;
bool check(int n){
if(n<=3) return n>1;
if(n%6!=1&&n%6!=5) return false;
for(int i=5;i<=n/i;i+=6){
if(n%i==0||n%(i+2)==0) return false;
}
return true;
}
void solve(){
cin>>n;
if(n==4||n==1){
cout<<n<<"\n";
return ;
}
for(int i=n;i>=0;i--){
if(check(i)){
cout<<i<<"\n";
return ;
}
}
}
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t;
cin>>t;
while(t--) solve();
}
B:
外切圆定理:找a+b=c+d
好像是因为每两个数不同,所以相加最多有4e5个数不同,然后就一定重复所以最多跑4e5复杂度
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <set>
#include<functional>
using namespace std;
const int N = 1e6+10;
#define int long long
int n,m;
int a[N];
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
set<int> st;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(st.count(a[i]+a[j])){
cout<<"YES\n";
return 0;
}
st.insert(a[i]+a[j]);
}
}
cout<<"NO\n";
}
C.
直接压缩dp
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <set>
#include<functional>
using namespace std;
const int N = 21;
#define int long long
int INF=1e18;
int n,m;
int a[N];
int g[N][N];
signed main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cin>>g[i][j];
}
vector<int> s(1<<n,0);
vector<vector<int>> f(1<<n,vector<int>(n,INF));
for(int i=0;i<1<<n;i++){
for(int j=0;j<n;j++){
if(i>>j&1) s[i]+=a[j];
}
}
f[0][0]=0;
for(int i=0;i<n;i++){
f[1<<i][i]=0;
}
int res=INF;
for(int i=0;i<1<<n;i++)
{
int lb=__builtin_ctz(i);
for(int j=lb;j<n;j++)
{
//表示以i为集合且最小的点是起点的最小路径和
if(f[i][j]>=INF/2||!(i>>j&1)) continue;
if(__builtin_popcount(i)>2&&g[lb][j]){
res=min(res,1ll*s[i]*(1ll*g[lb][j]+f[i][j]));
}
for(int k=lb+1;k<n;k++){
if(i>>k&1 || g[j][k]==0) continue;
f[i|(1<<k)][k]=min(f[i|(1<<k)][k],f[i][j]+g[j][k]);
}
}
}
if(res>=INF/2) res=-1;
cout<<res;
}