A - As Much As 996
題目大意
給定一個(gè)數(shù)字字符串,表示早上開(kāi)始上班時(shí)間勘高,下午(晚上?)下班時(shí)間似忧,一周工作幾天,比如就是早上
點(diǎn)到晚上
點(diǎn)据某,一周工作
天橡娄。
分析
沒(méi)啥分析的诗箍,簽到題
#include <cstdio>
#include <iostream>
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
題目大意
一副特制的撲克牌癣籽,有種花色,每種花色有
張牌滤祖,點(diǎn)數(shù)為
筷狼,其中有一張牌被抽走,也即有
對(duì)點(diǎn)數(shù)相同的牌匠童,
張點(diǎn)數(shù)獨(dú)特的牌(稱之為烏龜牌)埂材,共
張牌。兩人輪流行動(dòng)汤求,每次隨機(jī)從對(duì)方手牌中抽出一張牌放入己方牌堆俏险,并立即丟棄掉所有已經(jīng)組成一對(duì)的手牌。如果某一方無(wú)手牌則此方獲勝扬绪。求給定初始手牌情況下的獲勝概率竖独。
題目分析
開(kāi)局二人肯定先把所有已經(jīng)組成對(duì)子的牌扔掉,手上剩下的牌全是單獨(dú)一張挤牛,并且烏龜在某個(gè)人手上莹痢。因此,二者的手牌數(shù)必定相差而且多的那張牌就是烏龜牌墓赴。我們用
表示處于
狀態(tài)下的獲勝概率竞膳。
表示除去烏龜牌還剩下多少對(duì)牌。
表示烏龜牌在對(duì)方手上,
表示烏龜牌在自己手上诫硕,
表示己方回合坦辟,
表示對(duì)方回合。
明顯的有:
己方抽牌章办,烏龜在對(duì)方手上锉走,概率抽烏龜,
概率消去一對(duì).
己方抽牌,烏龜在自己手上纲菌,抽對(duì)面的牌必然消去一對(duì)自己的手牌挠日。
對(duì)面抽牌,烏龜在對(duì)方手上翰舌,抽自己的牌必然消去一對(duì)對(duì)方的手牌嚣潜。
對(duì)面抽牌,烏龜在自己手上椅贱,概率抽烏龜懂算,
概率消去一對(duì)
將與
聯(lián)立解方程即可得到:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
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
題目大意
按照已經(jīng)給出的神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)只冻,構(gòu)建一個(gè)文字識(shí)別的神經(jīng)網(wǎng)絡(luò),要求給定幅二值化后的
像素的圖片计技,識(shí)別出是字符
的哪一個(gè)喜德。例如,輸入:
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
應(yīng)該識(shí)別出來(lái)是字符.
題目分析
就是把原題目看懂垮媒,弄明白每個(gè)操作舍悯,寫(xiě)就完事了。輸入第一行數(shù)字不用管睡雇,接下來(lái)的輸入分別是:卷積層的權(quán)重和偏移量萌衬,卷積層
的權(quán)重和偏移量。全連接層
的權(quán)重和偏移量它抱,全連接層
的權(quán)重和偏移量秕豫。
卷積層的權(quán)重矩陣是
個(gè)
的矩陣。假設(shè)我們輸入的圖片信息保存在數(shù)組
中观蓄,那么
是一個(gè)
的矩陣混移。對(duì)于
矩陣中每一個(gè)
的子矩陣,將其按順序與卷積層
的權(quán)重矩陣相“乘”侮穿,注意這里的乘不是矩陣相乘歌径,而是對(duì)應(yīng)位置上的元素相乘之和,作為一個(gè)值撮珠。也就是說(shuō)沮脖,把
矩陣的每一個(gè)
的子矩陣都算出來(lái)一個(gè)特征值,特征值加上對(duì)應(yīng)的偏移量芯急,生成一個(gè)
的新矩陣勺届。接下來(lái)的每一個(gè)操作都與這個(gè)類似。
下面的每一行的都將成為下一行的
最大池化指的是將的矩陣劃分成
塊娶耍,每一塊對(duì)應(yīng)原來(lái)的
子矩陣免姿,取子矩陣中的最大值作為新矩陣對(duì)應(yīng)位置的值。
是指講矩陣中每個(gè)元素與
比較取
.
卷積層2里每一個(gè)都會(huì)轉(zhuǎn)化成一個(gè)
,卷積層2的權(quán)重矩陣有
個(gè)榕酒,每4個(gè)轉(zhuǎn)化后的
求和作為一個(gè)
也即
看里面哪一個(gè)元素最大胚膊,假設(shè)最大的元素為
分別對(duì)應(yīng)
想鹰。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
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<<FC_2_b[3]<<endl;
scanf("%d",&T);//cout<<T<<endl;
}
void inC(){
for(int i=0;i<28;i++){
scanf("%s",inputLine);
for(int j=0;j<28;j++)
in[i][j]=double(inputLine[j]-'0');
}
}
double Out_Conv1[4][24][24];
double Out_max_Conv1[4][12][12];
double Out_Conv2[9][10][10];
double Out_Flat[225];
double Out_FC[64];
double Out[4];
int main(){
init();
while(T--){
inC();
for(int i=0;i<4;i++)
for(int j=0;j<24;j++)
for(int k=0;k<24;k++){
Out_Conv1[i][j][k]=Conv_1_b[i];
for(int dj=0;dj<5;dj++)
for(int dk=0;dk<5;dk++)
Out_Conv1[i][j][k]+=Conv_1_w[i][dj][dk]*in[j+dj][k+dk];
}
for(int i=0;i<4;i++)
for(int j=0;j<12;j++)
for(int k=0;k<12;k++)
Out_max_Conv1[i][j][k]=max(0.0,max(
max(Out_Conv1[i][j*2][k*2],Out_Conv1[i][j*2+1][k*2+1]),
max(Out_Conv1[i][j*2+1][k*2],Out_Conv1[i][j*2][k*2+1])));
for(int i=0;i<9;i++)
for(int j=0;j<10;j++)
for(int k=0;k<10;k++){
Out_Conv2[i][j][k]=Conv_2_b[i];
for(int p=0;p<4;p++)
for(int dj=0;dj<3;dj++)
for(int dk=0;dk<3;dk++)
Out_Conv2[i][j][k]+=Out_max_Conv1[p][j+dj][k+dk]*Conv_2_w[i][p][dj][dk];
}
for(int i=0;i<9;i++)
for(int j=0;j<5;j++)
for(int k=0;k<5;k++)
Out_Flat[i*25+j*5+k]=max(0.0,max(
max(Out_Conv2[i][j*2][k*2],Out_Conv2[i][j*2+1][k*2+1]),
max(Out_Conv2[i][j*2+1][k*2],Out_Conv2[i][j*2][k*2+1])));
for(int i=0;i<64;i++){
Out_FC[i]=FC_1_b[i];
for(int j=0;j<225;j++)
Out_FC[i]+=FC_1_w[i][j]*Out_Flat[j];
Out_FC[i]=max(0,Out_FC[i]);
}
for(int i=0;i<4;i++){
Out[i]=FC_2_b[i];
for(int j=0;j<64;j++)
Out[i]+=FC_2_w[i][j]*Out_FC[j];
Out[i]=max(0,Out[i]);
}
double mini=-999.9;int ans=-1;
for(int i=0;i<4;i++)
if(Out[i]>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
題目大意
外國(guó)姓名的縮寫(xiě)是每個(gè)單詞的首字符大寫(xiě)∥赏瘢現(xiàn)在給出n個(gè)外國(guó)名,求有多少對(duì)外國(guó)人的姓名縮寫(xiě)相同辑舷。
題目分析
先提取出縮寫(xiě)喻犁,然后排序,縮寫(xiě)相同的一定排在一起。順序掃一遍肢础,掃到有個(gè)相同的縮寫(xiě)答案就加上
.
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
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<len;j++)
if (s[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小時(shí)还栓,每小時(shí)m分鐘,因此時(shí)鐘的顯示是從到
.如果某個(gè)時(shí)刻時(shí)鐘的顯示分鐘數(shù)大于等于顯示的時(shí)鐘數(shù)传轰,則可以劃水剩盒。問(wèn)一天的劃水時(shí)長(zhǎng)占總多少比例,輸出最簡(jiǎn)分?jǐn)?shù)慨蛙。
題目分析
沒(méi)啥分析的辽聊,暴力算就行。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
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<<a<<"/"<<b;
}
L - Liwa River
題目大意
ACM 來(lái)了許多隊(duì)伍參加股淡, 隊(duì)伍的人數(shù)最少人最多
人身隐。要為這些隊(duì)伍安排長(zhǎng)凳廷区。每一個(gè)長(zhǎng)凳都可以坐至多
個(gè)人唯灵。來(lái)自同一個(gè)隊(duì)伍的人不能坐在不同的長(zhǎng)凳上。現(xiàn)在給出人數(shù)為
的隊(duì)伍各自有多少隊(duì)隙轻,求最少長(zhǎng)凳需求數(shù)埠帕。
題目分析
貪心,優(yōu)先安排隊(duì)伍人數(shù)多的隊(duì)伍玖绿。人隊(duì)不必多說(shuō)敛瓷,
人隊(duì)盡量多插一些
人隊(duì),
人隊(duì)安排后優(yōu)先讓
人隊(duì)拼凳斑匪,其次在考慮
人隊(duì)呐籽。
人按順序優(yōu)先級(jí)依次考慮
,
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
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<<"+"<<ans<<endl;
ans+=f[5]; // cout<<"+"<<ans<<endl;
f[1]-=f[5];f[1]=max(f[1],0);
ans+=f[4]; //cout<<"+"<<ans<<endl;
p=min(f[4],f[2]);
f[2]-=p;f[4]-=p;
p=min(2*f[4],f[1]);
f[1]-=p;
ans+=(f[3]/2+(f[3]%2!=0));//cout<<"+"<<ans<<endl;
f[3]%=2;
if(f[3]==1){
if(f[2]>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<<"+"<<ans<<endl;
p=f[2]%3;
if(p==2) f[1]-=2;
if(p==1) f[1]-=4;
f[1]=max(f[1],0);
ans+=f[1]/6+(f[1]%6!=0);//cout<<"+"<<ans<<endl;
printf("%d\n",ans);
}
}