A 有一点点不懂
普通欧式素数筛O(n)
#include <iostream>
using namespace std;
#define MAX_N 30000001
#define ll long long
bool check[MAX_N] = {0};
ll prime[MAX_N] = {0};
ll init(ll n){
ll count = 0;
ll ans = 0;
for(ll i=2;i<=n;i++){
if(check[i] == 0){
prime[count] = i;
ans += i;
count++;
}
for(ll j=0;j<count&&i*prime[j]<=n;j++){
check[i*prime[j]]++;
ans += prime[j];
if(i%prime[j]==0)
break;
}
}
return ans;
}
int main(){
ll n;
cin>>n;
cout<<init(n);
return 0;
}
C
#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;i++)
#define per(i,a,b) for(ll i=a;i>=b;i--)
using namespace std;
const int maxn = 1e7+5;
ll a[maxn];
inline ll read(){
register ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return (f==1)?x:-x;
}
int main(){
ll n,k;
n=read();
k=read();
rep(i,0,n-1){
a[i]=read();
}
sort(a,a+n);
ll minn=0,maxx=0;
ll ans=0;
if(2*k<=n)k=k;//至少每队可以分成2个人
else k=n-k;//人数不够,尽量分成两队,但是有n-k个人只能一人组队
rep(i,0,k-1)minn+=a[i];
per(i,n-1,n-k)maxx+=a[i];
ans=maxx-minn;
printf("%lld\n",ans);
return 0;
}
/*
进行排序,然后最大和最小一队
所以假设2人一队,
如果说2*k<=n,也就是说,一队不止要两人,但只考虑最大和最小即可
如果2*K>n,也就是说,有些队伍是需要1个人一队的,2k-n是1人1队的人数那么(n-(2k-n))/2=n-k就是2人组队的队数
*/
D
判断4个点是否能组成正方形
4条边相等,且对角线相等,且直角边与对角线符合关系,用set或者vector排序或map
而且注意,尽量别用double,转换为整数比较好
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int x[5],y[5];
int dir[][2]={0,1,0,-1,1,0,-1,0};
int getdis(int x1,int y1,int x2,int y2){
return pow(x1-x2,2)+pow(y1-y2,2);
}
bool check(){
std::vector<int> v;
for(int i=1;i<=4;i++){
for(int j=i+1;j<=4;j++){
v.push_back(getdis(x[i],y[i],x[j],y[j]));
}
}
sort(v.begin(),v.end());
if(v[0]==v[3]&&v[4]==v[5]&&v[4]==2*v[0]&&v[5]!=0)return true;
else return false;
}
bool change(){
for(int i=1;i<=4;i++){//点
for(int j=0;j<4;j++){//方向
x[i]+=dir[j][0];
y[i]+=dir[j][1];
if(check())return true;
x[i]-=dir[j][0];//回溯
y[i]-=dir[j][1];
}
}
return false;
}
int main(){
for(int i=1;i<=4;i++){
cin>>x[i]>>y[i];
}
if(check()){
printf("wen\n");
}else if(change()){
printf("hai xing\n");
}else{
printf("wo jue de bu xing\n");
}
return 0;
}