第七届福建省大学生程序设计竞赛-重现赛(感谢承办方闽江学院)

Ranklist

Pro.C Card Game (First Edition)
foj2264题目链接
要么赢,要么输。
人生不也是这样吗?Do or die.

#include<stdio.h>
int main()
{
    int t,c,n,i,x;
    scanf("%d",&t);
    for(c=1;c<=t;c++){
        scanf("%d",&n);
        for(i=1;i<=2*n;i++) scanf("%d",&x);
        printf("Case %d: %.2f\n",c,n/2.0);
    }
}

Pro.D Card Game (Second Edition)
foj2265题目链接
每次随机出牌意味着Fat brother的每一张牌遇到Maze的每张牌是等概率的,一共n种情况,统计出后者有几张牌小于前者的那一张牌,除以n即得该牌能赢的概率,再乘以1即得该牌得分的期望。
遍历Fat brother的每张牌分别计算,累加得到答案。

#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 10005
int t,c,n,i,a[N],b[N],p;
int main()
{
    scanf("%d",&t);
    for(c=1;c<=t;c++){
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%d",&a[i]);
        for(i=1;i<=n;i++) scanf("%d",&b[i]);
        sort(b+1,b+1+n);
        double s=0;
        for(i=1;i<=n;i++){
            p=lower_bound(b+1,b+1+n,a[i])-b;
            s+=p-1;
        }
        s/=1.0*n;
        printf("Case %d: %.2f\n",c,s);
    }
}

Pro.E Card Game (Third Edition)
foj2266题目链接
英语阅读理解签到题

#include<stdio.h>
int main()
{
    int t,c,n,i,x,s,a[10005];
    scanf("%d",&t);
    for(c=1;c<=t;c++){
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%d",&a[i]);
        for(s=0,i=1;i<=n;i++){
            scanf("%d",&x);
            if(a[i]+x>10) s++;
        }
        printf("Case %d: %d\n",c,s);
    }
}

Pro.G Cutting Game
foj2268题目链接
联想多重背包的二进制优化
其本质可以参考一下这道题

#include<stdio.h>
int main()
{
    int t,c,n,s;
    scanf("%d",&t);
    for(c=1;c<=t;c++){
        scanf("%d",&n);
        s=0;
        while(n) n>>=1,s++;
        printf("Case %d: %d\n",c,s);
    }
}

Pro.I Two Triangles
foj2270题目链接
虽然代码写得略显冗杂,但是1A真的开心坏了昂^_^
遍历所有取三个点的情况
首先,三点共线不可取(代码中用叉积是否等于0判断是否三点共线)
其次,三角形可以平移、旋转,但是不能翻转(如第二组样例所见)
判全等用了SSS(三边相等),那怎么排除掉翻转的情况呢?
根据哪三边相等可以得出是哪三个顶点对应,然后通过判断某一点与该点对应点是否在其对边与对边的对应边的同侧(叉积的乘积大于0)
写这段代码的时候根本不敢复制粘贴,是一个字符一个字符认认真真敲出来的,生怕出错嘤嘤嘤

#include<stdio.h>
#include<math.h>
#define eps 1e-6
struct node
{
    double x,y;
}a[15];
double dis(node p,node q)
{
    return (p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y);
}
double eql(double p,double q)
{
    return fabs(p-q)<eps;
}
double cj(node p,node q,node r)
{
    return (q.x-p.x)*(r.y-p.y)-(r.x-p.x)*(q.y-p.y);
}
int main()
{
    int c,t,n,i,j,k,u,v,w,ans;
    double s1,s2,s3,s4,s5,s6,z1,z2;
    scanf("%d",&t);
    for(c=1;c<=t;c++){
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
        for(ans=0,i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
        for(k=j+1;k<=n;k++){
            if(eql(cj(a[i],a[j],a[k]),0)) continue;
            s1=dis(a[i],a[j]),s2=dis(a[j],a[k]),s3=dis(a[k],a[i]);
            z1=cj(a[i],a[j],a[k]),z2=cj(a[j],a[i],a[k]);
            for(u=1;u<=n;u++)if(u!=i&&u!=j&&u!=k)
            for(v=u+1;v<=n;v++)if(v!=i&&v!=j&&v!=k&&v!=u)
            for(w=v+1;w<=n;w++)if(w!=i&&w!=j&&w!=k&&w!=u&&w!=v){
                if(eql(cj(a[u],a[v],a[w]),0)) continue;
                s4=dis(a[u],a[v]),s5=dis(a[v],a[w]),s6=dis(a[w],a[u]);
                if(eql(s1,s4)){
                    if(eql(s2,s5)&&eql(s3,s6))
                        if(z1*cj(a[u],a[v],a[w])>0&&z2*cj(a[v],a[u],a[w])>0) { ans++;continue; }
                    if(eql(s2,s6)&&eql(s3,s5))
                        if(z1*cj(a[v],a[u],a[w])>0&&z2*cj(a[u],a[v],a[w])>0) { ans++;continue; }
                }
                if(eql(s2,s4)){
                    if(eql(s1,s5)&&eql(s3,s6))
                        if(z1*cj(a[w],a[v],a[u])>0&&z2*cj(a[v],a[w],a[u])>0) { ans++;continue; }
                    if(eql(s1,s6)&&eql(s3,s5))
                        if(z1*cj(a[w],a[u],a[v])>0&&z2*cj(a[u],a[w],a[v])>0) { ans++;continue; }
                }
                if(eql(s3,s4)){
                    if(eql(s1,s5)&&eql(s2,s6))
                        if(z1*cj(a[v],a[w],a[u])>0&&z2*cj(a[w],a[v],a[u])>0) { ans++;continue; }
                    if(eql(s1,s6)&&eql(s2,s5))
                        if(z1*cj(a[u],a[w],a[v])>0&&z2*cj(a[w],a[u],a[v])>0) { ans++;continue; }
                }
            }
        }
        printf("Case %d: %d\n",c,ans);
    }
}

Pro.J X
foj2271题目链接
首先处理出输入过程中重复的边
在跑Floyd的过程中,当mp[i][j]的值能够被k更新、输入中有i到j的边且没被删除过的时候,说明可以删除掉原来i到j的边
wa点:
1、原来有的边才能够被删除
2、同一条边不能被重复删除
3、“mp[i][j]>=mp[i][k]+mp[k][j]”中的等号千万别落下,相等的时候意味着i到j的边可以被取代(删掉不影响)

#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 105
#define inf 0x3f3f3f3f
int mp[N][N],vs[N][N],t,c,n,m,i,j,k,u,v,w,ans;
int main()
{
    scanf("%d",&t);
    for(c=1;c<=t;c++){
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)for(j=1;j<=n;j++) mp[i][j]=inf,vs[i][j]=0;
        ans=0;
        while(m--){
            scanf("%d%d%d",&u,&v,&w),vs[u][v]=vs[v][u]=1;
            if(mp[u][v]!=inf) ans++;
            mp[u][v]=mp[v][u]=min(mp[u][v],w);
        }
        for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)
        if(mp[i][j]>=mp[i][k]+mp[k][j]){
            mp[i][j]=mp[i][k]+mp[k][j];
            if(vs[i][j]) ans++,vs[i][j]=vs[j][i]=0;
        }
        printf("Case %d: %d\n",c,ans);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值