A - Bungee Jumping POJ - 2463
题意:有一个人要用一段绳子来跳楼,现在给你绳子的弹性系数、绳子的长度、楼的高度和人的质量,根据物理知识判断这个人是会摔死、还是安全着陆、还是被挂在半空(如果下落速度超过10m/s就会摔死、重力势能小于到达地面的弹性势能会被挂在半空中)。
题解:初中物理
重力势能:m * g * h
弹性势能:0.5 * k * x ^ 2
动能: 0.5 *m * v^2
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
double k,l,h,m;
while(scanf("%lf%lf%lf%lf",&k,&l,&h,&m)!=EOF)
{
if(k==0&&l==0&&h==0&&m==0) break;
double g=9.81;
double v;
if(l>=h)
{
v=sqrt(2*g*h);
if(v>10) printf("Killed by the impact.\n");
else printf("James Bond survives.\n");
}
else
{
v=sqrt((m*g*h-0.5*k*(h-l)*(h-l))*2/m);
if(m*g*h<0.5*k*(h-l)*(h-l))
{
printf("Stuck in the air.\n");
}
else
{
if(v>10) printf("Killed by the impact.\n");
else printf("James Bond survives.\n");
}
}
}
return 0;
}
B - The Average POJ - 2833
题意:给你n个数,让你去掉前n1大的数和前n2小的数,求剩余数的平均值。
题解:n1和n2很小,用两个优先队列维护即可。
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue<long long>q1;
priority_queue<long long>q2;
int main()
{
int n1,n2,n;
while(scanf("%d%d%d",&n1,&n2,&n)!=EOF)
{
if(n1==0&&n2==0&&n==0) break;
long long sum=0;
for(int i=1;i<=n;i++)
{
long long x;
scanf("%lld",&x);
sum+=x;
if(q1.size()<n1) q1.push(-x);
if(q2.size()<n2) q2.push(x);
if(q1.size()==n1&&x>-q1.top())
{
q1.pop();
q1.push(-x);
}
if(q2.size()==n2&&x<q2.top())
{
q2.pop();
q2.push(x);
}
}
while(!q1.empty())
{
sum-=-q1.top();
q1.pop();
}
while(!q2.empty())
{
sum-=q2.top(); q2.pop();
}
printf("%.6f\n",(sum*1.0)/(n-n1-n2));
}
}
C - The Embarrassed Cryptographer HDU - 2303
题意:给你一个超级大的数a和一个100万以下的数b,求a所有素数因子中最小的是否大于b,有就输出bad和这个素数,不然就输出good。
题解:先筛素数,再大整数取模(口胡)。
D - Safecracker HDU - 1015
题意:大写字母A、B、C…Z分别表示正整数1、2、3…26,给出正整数target和一些大写字母,求解满足v - w^2 + x^3 - y^4 + z^5 = target,按最大字典序输出。
题解:5层循环枚举
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[29];
int cmp(int aa,int bb)
{
return aa>bb;
}
int main()
{
int n;
string s;
while(cin>>n>>s)
{
if(n==0&&s=="END") break;
int l=s.length();
for(int i=0;i<l;i++)
{
a[i]=s[i]-'A'+1;
}
sort(a,a+l,cmp);
bool flag=0;
for(int i=0;i<l;i++)
{
for(int j=0;j<l;j++)
{
if(i!=j)
{
for(int k=0;k<l;k++)
{
if(i!=k&&j!=k)
{
for(int q=0;q<l;q++)
{
if(i!=q&&j!=q&&k!=q)
{
for(int p=0;p<l;p++)
{
if(i!=p&&j!=p&&k!=p&&q!=p)
{
if(a[i]-a[j]*a[j]+a[k]*a[k]*a[k]-a[q]*a[q]*a[q]*a[q]+a[p]*a[p]*a[p]*a[p]*a[p]==n)
{
flag=1;
printf("%c%c%c%c%c\n",a[i]+'A'-1,a[j]+'A'-1,a[k]+'A'-1,a[q]+'A'-1,a[p]+'A'-1);
break;
}
}
}
}
if(flag) break;
}
}
if(flag) break;
}
}
if(flag) break;
}
if(flag) break;
}
if(!flag)
{
printf("no solution\n");
}
}
}
E - Big Number HDU - 1018
题意:求n!的位数。
题解:求一个数的位数即对这个数取log10,而log(n*m)=logn+logm,所以求阶乘的位数即从1到n取log10再求和即可。
AC版:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int x;
scanf("%d",&x);
double sum=0;
for(int i=1;i<=x;i++)
{
sum+=log10(i);
}
int ans=(int)sum+1;
printf("%d\n",ans);
}
}
MLE版:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[10000000+10];
int main()
{
double ans=0;
for(int i=1;i<=10000000;i++)
{
ans+=log10(i);
a[i]=(int)ans+1;
}
int t;
scanf("%d",&t);
while(t--)
{
int x;
scanf("%d",&x);
printf("%d\n",a[x]);
}
}
F - Train Problem II HDU - 1023
题意:火车按一定顺序进站,问出站3顺序有几种?
题解:卡特兰数
G - Prime Friend HDU - 3823
题意:已知两个数a,b,求一个最小的数c,使得a+c和b+c均为素数,并且它们之间没有素数。
题解:筛素数再比对
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=20000000+10;
bool isprime[maxn];
int prime[maxn];
bool vis[200];
int main()
{
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1]=0;
int m=0;
for(int i=2;i<maxn;i++)
{
if(isprime[i])
{
prime[++m]=i;
for(int j=i+i;j<maxn;j+=i)
{
isprime[j]=0;
}
}
}
for(int i=2;i<=m;i++)
{
if(prime[i]-prime[i-1]<150)
{
vis[prime[i]-prime[i-1]]=1;
}
}
int t;
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
int a,b;
scanf("%d%d",&a,&b);
if(a>b)
{
swap(a,b);
}
int ans=-1;
printf("Case %d: ",k);
if(!vis[b-a]||a==b)
{
printf("-1\n");
}
else
{
for(int i=2;i<=m;i++)
{
if(prime[i]-prime[i-1]==b-a&&a<=prime[i-1])
{
ans=prime[i-1]-a;
break;
}
}
printf("%d\n",ans);
}
}
return 0;
}
H - Number Sequence POJ - 1019
题意:有1串数字呈现112123123412345…这样的规律,问你第n个数字是多少?
题解:
I - Train Problem I HDU - 1022
题意:给你一列火车的进站顺序和出站顺序,问你能否实现。
题解:模拟
#include<cstdio>
#include<stack>
using namespace std;
stack<char>s;
int main()
{
int n;
string s1,s2;
while(cin>>n>>s1>>s2)
{
while(!s.empty()) s.pop();
int now=0;
for(int i=0;i<n;i++)
{
s.push(s1[i]);
while(!s.empty()&&s.top()==s2[now])
{
s.pop();
now++;
}
}
if(!s.empty())
{
printf("No.\n");
printf("FINISH\n");
}
else
{
printf("Yes.\n");
now=0;
for(int i=0;i<n;i++)
{
s.push(s1[i]);
printf("in\n");
while(!s.empty()&&s.top()==s2[now])
{
s.pop();
now++;
printf("out\n");
}
}
printf("FINISH\n");
}
}
}
J - Anagrams by Stack HDU - 1515
题意:给你一段序列A和序列B,让你用栈模拟使序列A转换成序列B,输出所有可能方法(i表示入栈,o表示出栈)。
题解:dfs
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
stack<int>s;
string s1,s2;
int len1,len2;
int ans[1005];
void dfs(int now1,int now2,int k)
{
if(now2==len2)
{
for(int i=0;i<k;i++)
{
if(ans[i]==0)
{
printf("o ");
}
else
{
printf("i ");
}
}
printf("\n");
}
if(now1<len1)
{
s.push(s1[now1]);
ans[k]=1;
dfs(now1+1,now2,k+1);
s.pop();
}
if(!s.empty()&&s.top()==s2[now2])
{
int hh=s.top(); s.pop();
ans[k]=0;
dfs(now1,now2+1,k+1);
s.push(hh);
}
}
int main()
{
while(cin>>s1>>s2)
{
len1=s1.length(),len2=s2.length();
cout<<'['<<endl;
dfs(0,0,0);
cout<<']'<<endl;
}
}