7.11.實驗 解題參考

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章