2019 年 “游族杯” 上海市高校程序设计邀请赛 (同步赛)暨ECNU校赛线上赛

Click to teleport

A - As Much As 996

题目大意
给定一个数字字符串,表示早上开始上班时间,下午(晚上?)下班时间,一周工作几天,比如就是早上点到晚上点,一周工作天。

分析
没啥分析的,签到题

#include 
#include 
using namespace std;

int main(){
    int n,s,t,d,ans=0;
    scanf("%d",&n);
    d=n%10; n/=10;
    if(n%100==10 || n%100==11) {t=n%100;n/=100;}
    else {t=n%10;n/=10;}
    s=n;
    ans= (12-s+t)*d;
    printf("%d",ans);
}

B-Black Peter

题目大意
一副特制的扑克牌,有种花色,每种花色有张牌,点数为,其中有一张牌被抽走,也即有对点数相同的牌,张点数独特的牌(称之为乌龟牌),共张牌。两人轮流行动,每次随机从对方手牌中抽出一张牌放入己方牌堆,并立即丢弃掉所有已经组成一对的手牌。如果某一方无手牌则此方获胜。求给定初始手牌情况下的获胜概率。

题目分析
开局二人肯定先把所有已经组成对子的牌扔掉,手上剩下的牌全是单独一张,并且乌龟在某个人手上。因此,二者的手牌数必定相差而且多的那张牌就是乌龟牌。我们用表示处于状态下的获胜概率。表示除去乌龟牌还剩下多少牌。表示乌龟牌在对方手上,表示乌龟牌在自己手上,表示己方回合,表示对方回合。

明显的有:
己方抽牌,乌龟在对方手上,概率抽乌龟, 概率消去一对.

己方抽牌,乌龟在自己手上,抽对面的牌必然消去一对自己的手牌。

对面抽牌,乌龟在对方手上,抽自己的牌必然消去一对对方的手牌。

对面抽牌,乌龟在自己手上,概率抽乌龟,概率消去一对

将与联立解方程即可得到:

#include
#include
#include
#include
using namespace std;
char s1[1001000],s2[1001000];
double f[1001000][2][2];
int main(){
    f[0][1][1]=f[0][1][0]=0;
    f[0][0][1]=f[0][0][0]=1.0;
    for(int i=1;i<=1000000;i++){
        f[i][1][0]=f[i-1][1][1];
        f[i][0][1]=f[i-1][0][0];
        f[i][1][1]=f[i-1][0][1]/(double)(i+2) + (double)(i+1)/(i+2) * f[i-1][1][0];
        f[i][0][0]=f[i-1][1][0]/(double)(i+2) + (double)(i+1)/(i+2) * f[i-1][0][1]; 
    }
    int _;scanf("%d",&_);
    while(_--){
        int l,n=0;scanf("%d",&l);
        scanf("%s%s",s1+1,s2+1);
        int in;
        for(int i=1;i<=l;i++){
            if(s1[i]=='1' && s2[i]=='1') n++;
            if(s1[i]=='1' && s2[i]=='0') in=1;
            if(s1[i]=='0' && s2[i]=='1') in=0;
        }
        printf("%.12lf\n",f[n][in][0]);
        
    }
}

E - ECNU MNIST

题目大意
按照已经给出的神经网络数据,构建一个文字识别的神经网络,要求给定幅二值化后的像素的图片,识别出是字符的哪一个。例如,输入:

0000000000000000000000000000
0000000000000000000000000000
0000000000000000000000000000
0000000111100000001111111000
0000001111111111111111111000
0000000111111111111111000000
0000001111111111110000000000
0000001111000000000000000000
0000001111000000000010000000
0000001110000000001110000000
0000001100000000011110000000
0000111100000001111110000000
0000111100111111111000000000
0000111111111111000000000000
0000111111111111000000000000
0001111110000000000000000000
0000111000000000000000000000
0001111000000000111000000000
0001111010000000111000000000
0001111111111111110000000000
0001111111111111100000000000
0000111111111110000000000000
0000111111110000000000000000
0000000000000000000000000000
0000000000000000000000000000
0000000000000000000000000000
0000000000000000000000000000
0000000000000000000000000000

应该识别出来是字符.
题目分析
就是把原题目看懂,弄明白每个操作,写就完事了。输入第一行数字不用管,接下来的输入分别是:卷积层的权重和偏移量,卷积层的权重和偏移量。全连接层的权重和偏移量,全连接层的权重和偏移量。

卷积层的权重矩阵是个的矩阵。假设我们输入的图片信息保存在数组中,那么是一个的矩阵。对于矩阵中每一个的子矩阵,将其按顺序与卷积层的权重矩阵相“乘”,注意这里的乘不是矩阵相乘,而是对应位置上的元素相乘之和,作为一个值。也就是说,把矩阵的每一个的子矩阵都算出来一个特征值,特征值加上对应的偏移量,生成一个的新矩阵。接下来的每一个操作都与这个类似。

下面的每一行的都将成为下一行的

最大池化指的是将的矩阵划分成 块,每一块对应原来的子矩阵,取子矩阵中的最大值作为新矩阵对应位置的值。

是指讲矩阵中每个元素与比较取.

卷积层2里每一个都会转化成一个,卷积层2的权重矩阵有个,每4个转化后的求和作为一个

也即

看里面哪一个元素最大,假设最大的元素为分别对应。

#include
#include
#include
#include
using namespace std;

int MagicNumber,T;
double Conv_1_w[4][5][5];
double Conv_1_b[4];
double Conv_2_w[9][4][3][3];
double Conv_2_b[9];
double FC_1_w[64][225];
double FC_1_b[64];
double FC_2_w[4][64];
double FC_2_b[4];

char inputLine[30];
double in[30][30];

double max(double L,double R){
    return L>R?L:R;
}

void init(){
    scanf("%d",&MagicNumber);
    for(int i=0;i<4;i++)
        for(int j=0;j<5;j++)
            for(int k=0;k<5;k++)
                scanf("%lf",&Conv_1_w[i][j][k]);

    for(int i=0;i<4;i++)
        scanf("%lf",&Conv_1_b[i]);

    for(int i=0;i<9;i++)
        for(int j=0;j<4;j++)
            for(int k=0;k<3;k++)
                for(int l=0;l<3;l++)
                    scanf("%lf",&Conv_2_w[i][j][k][l]);

    for(int i=0;i<9;i++)
        scanf("%lf",&Conv_2_b[i]);

    for(int i=0;i<64;i++)
        for(int j=0;j<225;j++)
            scanf("%lf",&FC_1_w[i][j]);

    for(int i=0;i<64;i++)
        scanf("%lf",&FC_1_b[i]);

    for(int i=0;i<4;i++)
        for(int j=0;j<64;j++)
            scanf("%lf",&FC_2_w[i][j]);

    for(int i=0;i<4;i++)
        scanf("%lf",&FC_2_b[i]);
    //cout<mini){
                mini=Out[i];
                ans=i;
            }
        if(ans==0) printf("C\n");
        if(ans==1) printf("E\n");
        if(ans==2) printf("N\n");
        if(ans==3) printf("U\n");
    }
    return 0;
}


F - Foreigners’s Trouble

题目大意
外国姓名的缩写是每个单词的首字符大写。现在给出n个外国名,求有多少对外国人的姓名缩写相同。
题目分析
先提取出缩写,然后排序,缩写相同的一定排在一起。顺序扫一遍,扫到有个相同的缩写答案就加上.

#include
#include
#include
#include
#include
using namespace std;
typedef unsigned long long LL;
#define maxn 500010

const LL base=31;
int cnt;LL a[maxn];char s[maxn*22];
int main()
{
    int n,i,j;LL ans,num;
    cnt=0;
    scanf("%d\n",&n);
    for (i=1;i<=n;i++)
    {
        scanf("%[^\n]%*c", s);
        LL sum=0;
        int len=strlen(s);
        for (j=0;j='A' && s[j]<='Z') 
          sum=sum*base+(s[j]-'A'+1);
        a[++cnt]=sum;
    }
    sort(a+1,a+1+cnt);
    ans=0;num=1;
    for (i=2;i<=cnt;i++)
     if (a[i]==a[i-1]) num++;
     else
     {
        ans+=num*(num-1)/2;
        num=1;
     }
    ans+=num*(num-1)/2;
    printf("%llu\n",ans);
    return 0;
}

H - Huashui Clock

题目大意
一天有h小时,每小时m分钟,因此时钟的显示是从到 .如果某个时刻时钟的显示分钟数大于等于显示的时钟数,则可以划水。问一天的划水时长占总多少比例,输出最简分数。
题目分析
没啥分析的,暴力算就行。

#include
#include
#include
#include
using namespace std;
long long gcd(long long x,long long y){
    if(x%y==0) return y;
    else return gcd(y,x%y);
}
int main(){
    long long n,m;cin>>n>>m;
    long long a,b;
    if(n>=m){
        a=m+1;b=2*n;
    }
    else{
        a=2*m-n+1;
        b=2*m;
    }
    long long div=gcd(a,b);
    a/=div;b/=div;
    cout<

L - Liwa River

题目大意
ACM 来了许多队伍参加, 队伍的人数最少人最多人。要为这些队伍安排长凳。每一个长凳都可以坐至多个人。来自同一个队伍的人不能坐在不同的长凳上。现在给出人数为的队伍各自有多少队,求最少长凳需求数。
题目分析
贪心,优先安排队伍人数多的队伍。人队不必多说,人队尽量多插一些人队,人队安排后优先让人队拼凳,其次在考虑人队。人按顺序优先级依次考虑,

#include
#include
#include
#include
using namespace std;
int main(){
    int _;scanf("%d",&_);
    while(_--){
        int f[7];
        for(int i=1;i<=6;i++)
            scanf("%d",&f[i]);
        int p;
        int ans=0;
        ans+=f[6];  //  cout<<"+"<0) {
                    f[2]--;f[1]--;
                    f[1]=max(f[1],0);
                }
                else{
                    f[1]-=3;
                    f[1]=max(f[1],0);
                }
            }
        ans+=(f[2]/3+(f[2]%3!=0));// cout<<"+"<

你可能感兴趣的:(2019 年 “游族杯” 上海市高校程序设计邀请赛 (同步赛)暨ECNU校赛线上赛)