第10届 “新秀杯” ACM程序设计大赛网络预选赛 部分代码~

来源:互联网 发布:远程控制软件源代码 编辑:程序博客网 时间:2024/06/06 01:46

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;}

0 0
原创粉丝点击