ProblemA(HDU1008)
直接模擬,每個請求根據狀態累計時間。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
int a[1000];
while(scanf("%d",&n)!=EOF && n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int sum;
sum=a[0]*6+5;
for(i=0;i<n-1;i++)
{
if(a[i+1]>a[i]) sum+=(a[i+1]-a[i])*6+5;
if(a[i+1]<a[i]) sum+=(a[i]-a[i+1])*4+5;
if(a[i+1]==a[i]) sum+=5;
}
printf("%d\n",sum);
}
return 0;
}
ProblemB(HDU1009)
一共有n個房子,每個房子裏有老鼠喜歡吃的javabeans,但是每個房間裏的javabeans的價格不一樣。老鼠用m元,問m元最多可以賣多少javabeans,其中每個房間裏的javabeans可以被分割。
很明顯就是個部分揹包,算法是貪心。先求單價,然後排個序就行了。
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Trade
{
int j,f;
double percent;
}mouse[3001];
bool cmp(Trade a,Trade b)
{
return a.percent>b.percent;
}
int main()
{
int n,m;
while(scanf("%d%d",&m,&n)!=EOF&&(n!=-1||m!=-1))
{
int i;
for(i=0;i<n;i++)
{
scanf("%d%d",&mouse[i].j,&mouse[i].f);
mouse[i].percent=(double)mouse[i].j/mouse[i].f;
}
sort(mouse,mouse+n,cmp);
double sum=0;
for(i=0;i<n;i++)
{
if(m>mouse[i].f)
{
sum+=mouse[i].j;
m-=mouse[i].f;
}
else
{
sum+=mouse[i].percent*m;
m=0;
break;
}
}
printf("%.3lf\n",sum);
}
return 0;
}
ProblemC(HDU1076)
簡單模擬,從這一年開始向後找,每一年一次判斷是否爲閏年,直到找到第n個潤年。
#include <stdio.h>
using namespace std;
bool leap(int y){
return y%4==0&&y%100||y%400==0;
}
int main(){
int y,T,n,cnt,i;
scanf("%d",&T);
while(T--){
scanf("%d%d",&y,&n);
cnt=0;
for(i=y;cnt<n;i++)
if(leap(i))
cnt++;
printf("%d\n",i-1);
}
return 0;
}
ProblemD(HDU1201)
這也是個純模擬就可以做的,比上一題略複雜一點。主要思路要注意的有:
<1>將出生年所經歷的天數與18歲生日那年度過的天數合在一起算作一年。
<2>不考慮閏年,則18年共度過18*365天。
<3>考慮閏年,首先出生年與18歲生日合在一起那年要單獨考慮,其他年份只要是閏年,則總天數加1天即可。
<4>單獨考慮合在一起年份,若出生年是閏年,並且在2月29日之前出生的,那麼他(她)必定經過2月29日這天,總天數加1,對於18歲那年,若該年是閏年,並且在2月28日之後出生的,他(她)同樣必定經過2月29這天,所以總天數加1.
<5>如果是在2月29日出生,18年時必定過不了生日了,輸出-1即可。
#include <stdio.h>
using namespace std;
int leap(int y)
{
if(y%400 == 0 || (y%4 == 0 && y%100!=0))
return 1;
return 0;
}
int main()
{
int y,m,d,i,n;
scanf("%d",&n);
while(n--)
{
int sum = 0;
scanf("%d-%d-%d",&y,&m,&d);
if(m == 2 && d == 29)
{
printf("-1\n");
continue;
}
sum = 365*18;
if(leap(y) && m<3)
sum++;
if(leap(y+18) && m>=3)
sum++;
for(i = y+1; i<y+18; i++)
if(leap(i))
sum++;
printf("%d\n",sum);
}
return 0;
}
ProblemE(HDU1049)
這一題可以直接模擬做,用循環,注意奇偶的情況。
#include<iostream>
using namespace std;
int main()
{
int n,u,d,i,j,time;
while(cin>>n>>u>>d)
{ if(n==0) break;
time=1;
while(n>0) //這裏一開始寫的是while(n) 沒注意到n<0也是真的 ,bug一次
{ if(time%2!=0)
n-=u;
else
n+=d;
time++;
}
cout<<(time-1)<<endl;
}
return 0;
}
也可以直接總結,理出公式,算是貪心了吧。。
總長爲n,上升一秒走u,休息一秒下降d。相當於每兩秒走(u-d);
先n-u,得到過了多少個u-d後超過n-u;
int t=(n-u)/(u-d);
if(t*(u-d)<(n-u)) t++;
t*=2;t++;
就是最後一秒可以一步到達~~~
#include<stdio.h>
int main()
{
int n,u,d;
while(scanf("%d%d%d",&n,&u,&d),n)
{
int t=(n-u)/(u-d);
if(t*(u-d)<(n-u)) t++;
t*=2;
t++;
printf("%d\n",t);
}
return 0;
}