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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值