ICPC2016 青岛 [Cloned]
A-Relic Discovery
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
int n,t;
int a,b;
int res=0;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
res=0;
while(n--)
{
scanf("%d%d",&a,&b);
res+=a*b;
}
printf("%d\n",res);
}
return 0;
}
B-Pocket Cube
题意:
给了一个魔方,魔方每个面有四个小方块。现在给了小方块上的数字,问魔方能否在一次旋转之内复原,即同一个面上的数字都相同。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
int a[10][10];
int t;
bool check(int x,int y)
{
int num1=1,num2=1;
for(int i=1;i<4;i++)
{
if(a[x][i]==a[x][i-1])num1++;
if(a[y][i]==a[y][i-1])num2++;
}
if(num1!=4||num2!=4)return false;
int num;
int sum=0;
for(int i=0;i<6;i++)
{
num=1;
for(int j=1;j<4;j++)
if(a[i][j]==a[i][j-1])num++;
sum+=num;
}
if(sum==24)return true;
if(x==0&&y==2)
{
if(a[1][0]!=a[1][1]||a[1][2]!=a[1][3])return false;
if(a[3][0]!=a[3][1]||a[3][2]!=a[3][3])return false;
if(a[4][0]!=a[4][2]||a[4][1]!=a[4][3])return false;
if(a[5][0]!=a[5][2]||a[5][1]!=a[5][3])return false;
if(a[1][0]==a[5][1]&&a[5][0]==a[3][0]&&a[3][2]==a[4][0]&&a[4][1]==a[1][2])return true;
if(a[1][0]==a[4][0]&&a[4][1]==a[3][0]&&a[3][2]==a[5][1]&&a[5][0]==a[1][2])return true;
return false;
}
else if(x==1&&y==3)
{
if(a[0][0]!=a[0][1]||a[0][2]!=a[0][3])return false;
if(a[2][0]!=a[2][1]||a[2][2]!=a[2][3])return false;
if(a[4][0]!=a[4][1]||a[4][2]!=a[4][3])return false;
if(a[5][0]!=a[5][1]||a[5][2]!=a[5][3])return false;
if(a[0][0]==a[5][2]&&a[5][0]==a[2][0]&&a[2][2]==a[4][2]&&a[4][0]==a[0][2])return true;
if(a[0][0]==a[4][2]&&a[4][0]==a[2][0]&&a[2][2]==a[5][2]&&a[5][0]==a[0][2])return true;
return false;
}
else if(x==4&&y==5)
{
if(a[0][0]!=a[0][2]||a[0][1]!=a[0][3])return false;
if(a[2][0]!=a[2][2]||a[2][1]!=a[2][3])return false;
if(a[1][0]!=a[1][2]||a[1][1]!=a[1][3])return false;
if(a[3][0]!=a[3][2]||a[3][1]!=a[3][3])return false;
if(a[0][0]==a[1][1]&&a[1][0]==a[2][1]&&a[2][0]==a[3][1]&&a[3][0]==a[0][1])return true;
if(a[0][0]==a[3][1]&&a[3][0]==a[2][1]&&a[2][0]==a[1][1]&&a[1][0]==a[0][1])return true;
return false;
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
for(int i=0;i<6;i++)
for(int j=0;j<4;j++)
scanf("%d",&a[i][j]);
if(check(0,2)||check(1,3)||check(4,5))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
C-Pocky
题意:
给了长度为L的pocky,将这个分成两部分,任意长度均有可能,吃掉左半部分,然后再选再吃。直到剩下的部分小于等于b就停止,问吃的次数的期望。
solution:
1.找规律
当L<=d,期望为0
当L>d,通过给定的样例,我们可以知道肯定和2的倍数有关系,并且有个等差0.693147,然后就去找2的规律,发现 l o g 2 = 0.693147 log2=0.693147 log2=0.693147, 2 1 = 2 l o g 2 2 , 此 时 为 1 + l n 2 \frac{2}{1}=2^{log_22},此时为1+ln2 12=2log22,此时为1+ln2, 4 1 = 2 l o g 2 4 , 此 时 为 1 + l n 4 \frac{4}{1}=2^{log_24},此时为1+ln4 14=2log24,此时为1+ln4, 8 1 = 2 l o g 2 8 , 1 + l n 8 \frac{8}{1}=2^{log_28},1+ln8 18=2log28,1+ln8, 16 1 4 = 2 l o g 2 16 , 1 + l n 16 \frac{16}{1}^4=2^{log_216},1+ln16 1164=2log216,1+ln16, 7 3 = 2 l o g 2 7 3 , 1 + l n 7 3 \frac{7}{3}=2^{log_2{\frac{7}{3}}},1+ln\frac{7}{3} 37=2log237,1+ln37,所以最后答案就变成了 1 + l n L b 1+ln{\frac{L}{b}} 1+lnbL
2.推式子
设x为0-L的任意一个位置。
当x<=d时, f ( x ) = 0 f(x)=0 f(x)=0
当x>d时, f ( x ) = 1 + ∫ d x f ( t ) d t x = 1 + F ( x ) − F ( d ) x f(x)=1+\frac{\int_{d}^{x}{f(t)dt}}{x}=1+\frac{F(x)-F(d)}{x} f(x)=1+x∫dxf(t)dt=1+xF(x)−F(d)
f ′ ( x ) = x F ′ ( x ) − F ( x ) + F ( d ) x 2 = x f ( x ) − ∫ d x f ( t ) d t x 2 = x f ( x ) + x ( 1 − f ( x ) ) x 2 = 1 x f^{'}(x)=\frac{xF^{'}(x)-F(x)+F(d)}{x^2} =\frac{xf(x)-\int_{d}^{x}{f(t)dt}}{x^2}=\frac{xf(x)+x(1-f(x))}{x^2}=\frac{1}{x} f′(x)=x2xF′(x)−F(x)+F(d)=x2xf(x)−∫dxf(t)dt=x2xf(x)+x(1−f(x))=x1
所以 f ( x ) = l n ( x ) + C f(x)=ln(x)+C f(x)=ln(x)+C
f ( d ) = l n ( d ) + C = 1 , C = 1 − l n ( d ) f(d)=ln(d)+C=1,C=1-ln(d) f(d)=ln(d)+C=1,C=1−ln(d)
f ( x ) = l n ( x ) − l n ( d ) + 1 = l n ( x d ) + 1 f(x)=ln(x)-ln(d)+1=ln(\frac{x}{d})+1 f(x)=ln(x)−ln(d)+1=ln(dx)+1
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
double d,L;
int n;
int main()
{
scanf("%d",&n);
while(n--)
{
scanf("%lf%lf",&L,&d);
if(L<=d)
printf("0.000000\n");
else
{
double x=1.0*L/d;
double res=1+log(x);
printf("%.6f\n",res);
}
}
return 0;
}