NOIP 2004 花生采摘

题面

link

solution

这题看起来很复杂,其实很水,注意别看错题目造成不必要的WA

废话不多说,上代码

code

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<iostream>
 4 using namespace std;
 5 /*
 6     你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;
 7     依此类推,不过你一定要在我限定的时间内回到路边。
 8 */
 9 struct node
10 {
11     int x,y,value;
12 };
13 
14 int m,n,k,t;
15 
16 struct node p[1000];
17 
18 int mov(int now)    //计算采花生步行过程中需要的时间花费 
19 {
20     int m;
21     m=abs(p[now-1].x-p[now].x)+abs(p[now-1].y-p[now].y);
22     return m;
23 }
24 
25 void Sort()     //按照花生的数量对有花生的节点进行降序排序 
26 {
27    for (int i=1;i<t;i++)
28         for (int j=i+1;j<=t;j++)
29             if (p[i].value<p[j].value) 
30             {
31              swap(p[i].x,p[j].x);
32              swap(p[i].y,p[j].y);
33              swap(p[i].value,p[j].value);
34             }
35 }
36 
37 int main()
38 {
39    cin>>m>>n>>k;
40    t=0;
41    int i,j;
42    for (i=1;i<=m;i++)      //输入数据处理 
43         for (j=1;j<=n;j++)
44         {
45             int value;
46             cin>>value; 
47             if (value!=0)
48             {
49                 p[++t].value=value;
50                 p[t].x=j; 
51                 p[t].y=i;
52             } 
53         }
54    Sort();    //节点的花生数量排序 
55    int now=1,ans=0;
56    p[0].x=p[1].x;
57    p[0].y=0; 
58    p[0].value=0; 
59    while ((k>0)&&((k-mov(now))>p[now].y)) //摘花生过程,且判断达到下一位置能否返回 
60    {
61        k-=mov(now);    //采花生过程中时间消耗计算 
62        k--;
63        ans+=p[now].value;  //能采到的花生节点,进行累计 
64        now++;          //继续尝试去踩下一个位置的花生 
65    }
66    cout<<ans<<endl;
67    return 0;
68  }

 

posted @ 2019-08-30 20:47  颓废の子乃酱  阅读(668)  评论(0编辑  收藏  举报