USACO-Section1.3 Combination Lock[其他]

来源:互联网 发布:冠能狗粮网络代理 编辑:程序博客网 时间:2024/06/04 08:38

题目:

为了防止聪明的牛逃跑,农场主买了一把劣质密码锁(三个数字轮盘可以转的那种),只要数字和本来的密码相差2个距离以内就算是匹配。输入n表示数字轮盘上共有n个数字,再输入6个数,分为两组,分别代表农场主设置的密码和锁自带的密码。如果牛旋转数字轮盘,匹配了其中一组,就可以打开锁。
例如:输入 50 1 2 3 5 6 7,则输出249。详情:
1,1,1 2,2,4 3,4,2 4,4,5 5,4,8 6,5,6 7,5,9 3,50,2 50,1,4
1,1,2 2,2,5 3,4,3 4,4,6 5,4,9 6,5,7 7,6,5 3,50,3 50,1,5
1,1,3 2,3,1 3,4,4 4,4,7 5,5,5 6,5,8 7,6,6 3,50,4 50,2,1
1,1,4 2,3,2 3,4,5 4,4,8 5,5,6 6,5,9 7,6,7 3,50,5 50,2,2
1,1,5 2,3,3 3,4,6 4,4,9 5,5,7 6,6,5 7,6,8 49,1,1 50,2,3
1,2,1 2,3,4 3,4,7 4,5,5 5,5,8 6,6,6 7,6,9 49,1,2 50,2,4
1,2,2 2,3,5 3,4,8 4,5,6 5,5,9 6,6,7 7,7,5 49,1,3 50,2,5
1,2,3 2,4,1 3,4,9 4,5,7 5,6,5 6,6,8 7,7,6 49,1,4 50,3,1
1,2,4 2,4,2 3,5,5 4,5,8 5,6,6 6,6,9 7,7,7 49,1,5 50,3,2
1,2,5 2,4,3 3,5,6 4,5,9 5,6,7 6,7,5 7,7,8 49,2,1 50,3,3
1,3,1 2,4,4 3,5,7 4,6,5 5,6,8 6,7,6 7,7,9 49,2,2 50,3,4
1,3,2 2,4,5 3,5,8 4,6,6 5,6,9 6,7,7 7,8,5 49,2,3 50,3,5
1,3,3 3,1,1 3,5,9 4,6,7 5,7,5 6,7,8 7,8,6 49,2,4 50,4,1
1,3,4 3,1,2 3,6,5 4,6,8 5,7,6 6,7,9 7,8,7 49,2,5 50,4,2
1,3,5 3,1,3 3,6,6 4,6,9 5,7,7 6,8,5 7,8,8 49,3,1 50,4,3
1,4,1 3,1,4 3,6,7 4,7,5 5,7,8 6,8,6 7,8,9 49,3,2 50,4,4
1,4,2 3,1,5 3,6,8 4,7,6 5,7,9 6,8,7 1,50,1 49,3,3 50,4,5
1,4,3 3,2,1 3,6,9 4,7,7 5,8,5 6,8,8 1,50,2 49,3,4 49,50,1
1,4,4 3,2,2 3,7,5 4,7,8 5,8,6 6,8,9 1,50,3 49,3,5 49,50,2
1,4,5 3,2,3 3,7,6 4,7,9 5,8,7 7,4,5 1,50,4 49,4,1 49,50,3
2,1,1 3,2,4 3,7,7 4,8,5 5,8,8 7,4,6 1,50,5 49,4,2 49,50,4
2,1,2 3,2,5 3,7,8 4,8,6 5,8,9 7,4,7 2,50,1 49,4,3 49,50,5
2,1,3 3,3,1 3,7,9 4,8,7 6,4,5 7,4,8 2,50,2 49,4,4 50,50,1
2,1,4 3,3,2 3,8,5 4,8,8 6,4,6 7,4,9 2,50,3 49,4,5 50,50,2
2,1,5 3,3,3 3,8,6 4,8,9 6,4,7 7,5,5 2,50,4 50,1,1 50,50,3
2,2,1 3,3,4 3,8,7 5,4,5 6,4,8 7,5,6 2,50,5 50,1,2 50,50,4
2,2,2 3,3,5 3,8,8 5,4,6 6,4,9 7,5,7 3,50,1 50,1,3 50,50,5
2,2,3 3,4,1 3,8,9 5,4,7 6,5,5 7,5,8

题解:

刚开始我想的方法是把所有情况都模拟(也就是可以直接输出所有情况)后来嫌烦放弃了。因为我发现这三个数字是重复的,所以实际上就是250(大于5个数字的情况,小于5就n^3就行了)减去可能出现的相同情况,比如说样例中的3,4,5就是两个密码都匹配的结果。而我没想出能把首末的情况统一的计算方法,于是就设置了很多的情况判断,虽然繁杂但行之有效。

代码

(可以说是非常丑陋了)

/*ID: xcwhkh1LANG: CTASK: combo*/#include <stdio.h>#include <string.h>int main () {    FILE *fin=fopen("combo.in","r");    FILE *fout=fopen("combo.out","w");    int n,i,sum=1;    int a[3],b[3],c[3];    for(i=0;i<3;i++)        c[i]=0;     fscanf(fin,"%d",&n);    fscanf(fin,"%d%d%d%d%d%d",&a[0],&a[1],&a[2],&b[0],&b[1],&b[2]);    if(n<=5)    {        fprintf(fout,"%d\n",n*n*n);        return 0;    }    else        for(int i=0;i<3;i++)        {            if(a[i]-b[i]>=0&&a[i]-b[i]<=4)                c[i]=5-a[i]+b[i];            if(b[i]-a[i]>=0&&b[i]-a[i]<=4)                c[i]=5-b[i]+a[i];            if(a[i]==1)                if(b[i]>=n-3)                    c[i]=b[i]-(n-4);            if(a[i]==2)                if(b[i]>=n-2)                    c[i]=b[i]-(n-3);            if(a[i]==3)                if(b[i]>=n-1)                    c[i]=b[i]-(n-2);            if(a[i]==4)                if(b[i]>=n)                    c[i]=b[i]-n+1;            if(b[i]==1)                if(a[i]>=n-3)                    c[i]=a[i]-(n-4);            if(b[i]==2)                if(a[i]>=n-2)                    c[i]=a[i]-(n-3);            if(b[i]==3)                if(a[i]>=n-1)                    c[i]=a[i]-(n-2);            if(b[i]==4)                if(a[i]>=n)                    c[i]=a[i]-n+1;        }    for(i=0;i<3;i++)        sum*=c[i];    fprintf(fout,"%d\n",250-sum);    return 0;}
原创粉丝点击