比赛链接:Contest Problem List (hdu.edu.cn)
1>1010Smzzl with Tropical Taste
样例输入:
2
1.1 2.2
2.05 1.4
样例输出:
N0 M0R3 BL4CK 1CE TEA!
ENJ0Y YOURS3LF!
题目大意:在一个水池内有体积为V的冰红茶,商店老板会以每秒qV的速度往水池当中倒冰红茶,而另一个人以每秒pV的速度进行喝冰红茶,问是否对于任意的冰红茶G,总能有时间T使得,当t大于T的时候,喝的冰红茶的数量大于G。
解题思路:每秒喝冰红茶的速度与加冰红茶的速度与体积是成正相关的,当喝的速度大于加的速度的时候,肯定会有喝完的时候,此时,加的速度变为0所有一定无法达成条件,只有当加的速度大于等于喝的速度才能够使得冰红茶不减少甚至更多。
代码:
#include <bits/stdc++.h>
using namespace std;
double eps=1e-5;
double p,q;
int t;
int main(){
cin>>t;
while(t--){
cin>>p>>q;
double x=1;
x+=q;
x-=p;
if(x>1-eps){
cout<<"N0 M0R3 BL4CK 1CE TEA!"<<endl;
}else{
cout<<"ENJ0Y YOURS3LF!"<<endl;
}
}
return 0;
}
2)Link with Limit
样例输入:
2
2
1 2
2
1 1
样例输出:
NO
YES
题目大意:
Link 有一个函数 f(x),其中 x 和 f(x) 都是 [1,n] 中的整数。 令 fn(x)=f(fn−1(x)) 且 f1(x)=f(x),他定义数 x 的幂为: g(x)=,他想知道 x 是否对所有 x∈[1,n] 都具有相同的幂。是的话输出“YES”,不是的话输出“NO”。
解题思路:不断迭代的过程实际上可以看成一个走图的过程,当n->∞只有环上的点权才会对极限有影响,因此原问题转化为求每个环的点权平均值是否相同。
代码:
#include <stdio.h>
#include <queue>
#define MN 100000
typedef long long ll;
int n,a[MN+5],din[MN+5];
void solve(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
din[i] = 0;
}
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
din[a[i]]++;
}
std::queue<int> Q;
for(int i=1;i<=n;i++){
if(din[i]==0) Q.push(i);
}
while(!Q.empty()){
int u = Q.front();
Q.pop();
din[a[u]]--;
if(din[a[u]]==0){
Q.push(a[u]);
}
}
ll p=-1,q=-1;
for(int i=1;i<=n;i++){
if(din[i]==0) continue;
ll tp=0,tq=0;
for(;din[i];i=a[i]){
tp += i;
tq++;
din[i] = 0;
}
if(p==-1){
p = tp;
q = tq;
}else{
if(p*tq!=q*tp){
puts("NO");
return;
}
}
}
puts("YES");
return;
}
int main(){
int T;
scanf("%d",&T);
while(T--) solve();
}
3)Fall with Trees
翻译:Fall 想画一个完美的二叉树。 我们首先规定树中具有相同深度的所有节点在平面上也具有相同的 y 坐标。将深度相同的节点定义为同一级别的节点,则完美二叉树具有四个属性。
- 它是一个完整的二叉树。
- 每个相邻级别的两个节点的 y 坐标之间的差异是一个常数。
- 同一层的两个相邻节点的 x 坐标之间的差异是恒定的。
- 每个节点的 x 坐标是其子节点 x 坐标的平均值。
Fall 绘制了这棵二叉树的根节点及其左右子节点。现在Fall打算一共画k层,然后把二叉树砍下来贴在墙上,所以他想知道这个完美二叉树的所有节点的凸包面积是多少 ?
样例输入:
3
3
0 0 -2 -2 2 -2
4
0 0 -4 -2 4 -2
10000
0 0 -10000 -10000 10000 -10000
样例输出:
14.000
54.000
3999000000000.000
分析:数学推理题。可以将每一层都看为一个梯形进行面积求和。(以样例为例)画图分析得到:第一层的底为4.第二层为6,第三层为7,分别对应8(1-1/2),8(1-1/4),8,(1-1/8),得到第i层的面积为8*1/2*(1-(1/2)^(i-1)+1-(1/2)^(i))*h.将所有面积求和推出公式,进行求值
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int k,t,x0,y0,x1,y1,x2,y2;
int main(){
cin>>t;
while(t--){
scanf("%d",&k);
//第一个节点的坐标以及其左右根节点
scanf("%d %d %d %d %d %d",&x0,&y0,&x1,&y1,&x2,&y2);
ll d=(x2-x1);
ll h=y0-y1;
ll S=(2ll*k-5)*d*h;
ll p=60000ll*d*h;
for(int i=1;i<=k&&p;i++)p>>=1;
S+=p/10000,p%=10000,k=p%10,p/=10;
printf("%lld.%03lld\n",S,p+(k>=5));
}
return 0;
}