A 世界是平的
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <cstring>
#include <queue>
using namespace std;
struct point3
{
double x,y,z;
};
struct line3
{
point3 a,b;
};
struct plane3
{
point3 a,b,c;
};
long long dmult(point3 u,point3 v)
{
return u.x*v.x+u.y*v.y+u.z*v.z;
}
point3 xmult(point3 u,point3 v)
{
point3 ret;
ret.x=u.y*v.z-v.y*u.z;
ret.y=u.z*v.x-u.x*v.z;
ret.z=u.x*v.y-u.y*v.x;
return ret;
}
point3 subt(point3 u,point3 v)
{
point3 ret;
ret.x=u.x-v.x;
ret.y=u.y-v.y;
ret.z=u.z-v.z;
return ret;
}
point3 pvec(point3 s1,point3 s2,point3 s3)
{
return xmult(subt(s1,s2),subt(s2,s3));
}
int dots_onplane(point3 a,point3 b,point3 c,point3 d)
{
return dmult(pvec(a,b,c),subt(d,a))==0;
}
double vlen(point3 p)
{
return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);
}
int dots_inline(point3 p1,point3 p2,point3 p3)
{
return vlen(xmult(subt(p1,p2),subt(p2,p3)))==0;
}
point3 p[100005];
int main()
{
int n;
//freopen("14.in","r",stdin);
while(scanf("%d",&n)==1)
{
//memset(p,0,sizeof(p));
for(int i=0; i<n; ++i)
{
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
}
//cout<<dots_inline(p[0],p[1],p[2])<<endl;
if(n<=3)
{
puts("Yes");
continue;
}
int pos=0;
for(int i=2;i<n;++i){
if(!dots_inline(p[0],p[1],p[i])){
pos=i;
break;
}
}
bool f=true;
for(int i=2; i<n; ++i)
{
//cout<<dots_onplane(p[0],p[1],p[2],p[i])<<endl;
if(!dots_onplane(p[0],p[1],p[pos],p[i]))
{
f=false;
break;
}
}
if(f)puts("Yes");
else puts("No");
}
return 0;
}
Problem C:心如刀割
只能套模板 还是不清楚怎么做的 还是等标程出来吧
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <cstring>
#include <queue>
using namespace std;
struct point
{
double x, y, z;
int f;
} pa[1005], pb[1005];
double xx,yy,zz;
int f;
int main()
{
int n, m, i;
while (scanf("%d", &n)==1)
{
int cnta=0,cntb=0;
for(i=0;i<n;++i){
scanf("%lf%lf%lf%d", &xx,&yy,&zz,&f);
if(f==1){
pa[cnta].x=xx;
pa[cnta].y=yy;
pa[cnta++].z=zz;
}
if(f==-1){
pb[cntb].x=xx;
pb[cntb].y=yy;
pb[cntb++].z=zz;
}
}
int cnt = 0, finish = 0;
double a = 0, b = 0, c = 0, d = 0;
while (cnt < 100005 && !finish)
{
finish = 1;
for (i = 0; i < cnta; i++)
if (a * pa[i].x + b * pa[i].y + c * pa[i].z + d > 0)
{
a -= pa[i].x;
b -= pa[i].y;
c -= pa[i].z;
d -= 3;
finish = 0;
}
for (i = 0; i < cntb; i++)
if (a * pb[i].x + b * pb[i].y + c * pb[i].z + d <= 0)
{
a += pb[i].x;
b += pb[i].y;
c += pb[i].z;
d += 3;
finish = 0;
}
cnt++;
}
if(cnt==100005)puts("No");
else puts("Yes");
}
return 0;
}
Problem E:不幸的程序猿
跑了JAVA的大数 节约时间 C取模需要注意好
公式:X=[N/2]-1 []代表取整
答案ans=(x+1)*x/2+((N-1)*N*(2N-1)-X(X+1)(2X+1))/6
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
import java.io.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner (new BufferedInputStream(System.in));
BigInteger N,m,ans1,ans2,ans,x,TWO=BigInteger.valueOf(2);
int n;
while(cin.hasNext()){
n=cin.nextInt();
N=BigInteger.valueOf(n);
m=cin.nextBigInteger();
m=m.add(BigInteger.ONE);
if(n==0){
System.out.println(0);
continue;
}
else if(n==1){
System.out.println(0);
continue;
}
else if(n==2){
System.out.println(BigInteger.ONE.mod(m));
continue;
}
else if(n==3){
System.out.println(BigInteger.valueOf(5).mod(m));
continue;
}
x=BigInteger.valueOf(n/2-1);
//System.out.println(x);
ans1=(x.add(BigInteger.ONE)).multiply(x).divide(TWO);
ans2=(((N.subtract(BigInteger.ONE)).multiply(N).multiply(N.multiply(TWO).subtract(BigInteger.ONE))).subtract(ans1.multiply(TWO).multiply(TWO.multiply(x).add(BigInteger.ONE)))).divide(BigInteger.valueOf(6));
System.out.println(ans1.add(ans2).mod(m));
}
}
}
Problem F:反转操作
规律题 可以先求第K位是什么数再反推
#include <iostream>
#include <set>
#include <cstring>
#include <map>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int main()
{
//freopen("data.in","w",stdout);
//ios::sync_with_stdio(false);
//cin.tie(0);
int t,n,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
if(n%2==0)
{
if(k<=n/2-1)
{
printf("%d\n",k*2+1);
}
else
{
printf("%d\n",(n-k-1)*2);
}
}
else
{
if(k<(n-1)/2)
{
printf("%d\n",k*2+1);
}
else
{
printf("%d\n",(n-k-1)*2);
}
}
}
return 0;
}
Problem G:异或序列
可以推出每位数前的系数为 (n-i+1)*i 再根据偶数个数异或为0的特性判断 若为奇数个则对其进行一次异或操作
#include <iostream>
#include <set>
#include <cstring>
#include <map>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int main()
{
//freopen("data.in","r",stdin);
//ios::sync_with_stdio(false);
//cin.tie(0);
int t,n;
long long a,ans;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ans=0;
for(long long i=1;i<=n;++i){
scanf("%lld",&a);
if(((n-i+1)*i)%2==1)ans^=a;
}
printf("%lld\n",ans);
}
return 0;
}
Problem I:去重数组
利用set容器的去重性 一开始就看到了这题 12s的时候就出了 ^_^
#include <iostream>
#include <set>
#include <cstring>
#include <map>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
set<int>s;
int main()
{
//freopen("data.in","r",stdin);
//ios::sync_with_stdio(false);
//cin.tie(0);
int n,a;
while(scanf("%d",&n)==1){
s.clear();
for(int i=0;i<n;++i){
scanf("%d",&a);
s.insert(a);
}
printf("%d\n",s.size());
}
return 0;
}