NOIP 2012 Day1 T3 开车旅行

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<iomanip>
  4 #include<cmath>
  5 #include<vector>
  6 #include<queue>
  7 #include<stack>
  8 #include<bitset>
  9 #include<algorithm>
 10 #include<string>
 11 #include<cstring>
 12 using namespace std;
 13 const long long w=1000000000;
 14 struct data{
 15     int no;
 16     long long sa,sb;
 17 };
 18     data f[100005][55];
 19 int n,m,s,p,q;
 20 long long a,b,k;
 21 double z=1e10;
 22 long long h[100005],hf[100005],hs[100005];
 23 int fir[100005],sec[100005];
 24 bool comp(int a,int b)
 25 {
 26     if (a<=b)  return true;
 27     return false;
 28 }
 29 void dfs(int x,int t,int w)
 30 {
 31     if (w%2!=0&&a+b+hs[x]<=t)
 32     {
 33         a+=hs[x];
 34         dfs(sec[x],t,w+1);
 35     }
 36     if (w%2==0&&a+b+hf[x]<=t)
 37     {
 38         b+=hf[x];
 39         dfs(fir[x],t,w+1);
 40     }
 41     return ;
 42 }
 43 void zzz(int x,int kk)
 44 {
 45     q=x;
 46     for (int j=50;j>=0;j--)
 47         if (f[x][j].no!=0&&f[x][j].sa<=w&&f[x][j].sb<=w&&f[x][j].sa!=0&&f[x][j].sb!=0&&f[x][j].sa+f[x][j].sb<=kk)
 48         {
 49             a+=f[x][j].sa;
 50             b+=f[x][j].sb;
 51             zzz(f[x][j].no,kk-f[x][j].sa-f[x][j].sb);
 52             break;
 53         }
 54     return ;
 55 }
 56 int main()
 57 {
 58     freopen ("drive.in","r",stdin);
 59     //freopen ("drive.out","w",stdout);
 60     scanf ("%d",&n);
 61     for (int i=1;i<=n;i++)  scanf ("%lld",&h[i]);
 62     memset (hf,127,sizeof(hf));
 63     memset (hs,127,sizeof(hs));
 64     for (int i=1;i<=n-1;i++)
 65         for (int j=i+1;j<=n;j++)
 66         {
 67             if (hf[i]>abs(h[i]-h[j])||(hf[i]==abs(h[i]-h[j])&&h[j]<h[fir[i]]))
 68             {
 69                 sec[i]=fir[i];
 70                 hs[i]=hf[i];
 71                 fir[i]=j;
 72                 hf[i]=abs(h[i]-h[j]);
 73             }
 74             else if (hs[i]>abs(h[i]-h[j])||(hs[i]==abs(h[i]-h[j])&&h[j]<h[sec[i]]))
 75             {
 76                 hs[i]=abs(h[i]-h[j]);
 77                 sec[i]=j;
 78             }
 79         }
 80     for (int i=1;i<=n;i++)
 81     {
 82         f[i][0].no=fir[sec[i]];
 83         f[i][0].sa=hs[i];
 84         f[i][0].sb=hf[sec[i]];
 85     }
 86     for (int j=1;j<=50;j++)
 87         for (int i=1;i<=n;i++)
 88         {
 89             f[i][j].no=f[f[i][j-1].no][j-1].no;
 90             f[i][j].sa=f[i][j-1].sa+f[f[i][j-1].no][j-1].sa;
 91             f[i][j].sb=f[i][j-1].sb+f[f[i][j-1].no][j-1].sb;
 92         }
 93     scanf ("%lld%d",&k,&m);
 94     for (int i=1;i<=n;i++)
 95     {
 96         a=0;b=0;
 97         zzz(i,k);
 98         if (f[q][0].sa+a+b<=k)  a+=f[q][0].sa;
 99         //dfs(i,k,1);
100         if (b!=0)
101         {
102             double zz=(double)a/b;//here
103             if (z>zz||(z==zz&&h[i]>h[p]))
104             {
105                 z=zz;
106                 p=i;
107             }
108         }
109     }
110     printf ("%d\n",p);
111     for (int i=1;i<=m;i++)
112     {
113         scanf ("%d%lld",&s,&k);
114         a=0;b=0;
115         //dfs(s,k,1);
116         //printf ("%lld %lld\n",a,b);
117         zzz(s,k);
118         if (f[q][0].sa+a+b<=k)  a+=f[q][0].sa;
119         printf ("%lld %lld\n",a,b);
120     }
121     return 0;
122 }
时间: 2024-09-29 20:46:43

NOIP 2012 Day1 T3 开车旅行的相关文章

2012Noip提高组Day1 T3 开车旅行

题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi− Hj|. 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次.他们计划 选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行.小 A 和小 B

NOIP 2012 Day1

tags: NOIP 模拟 倍增 高精 Python categories: 信息学竞赛 总结 Luogu P1079 Vigenère 密码 Solution 表示并不是很懂其他人发的题解. 我是这么想的, 既然是题目要求用密文转明文而且转换规则一定的, 所以就可以用明文转密文的逆过程来完成. 首先要搞明白明文是怎么变成密文的, 通过这个表可以观察到, 如果明文的一个字符是 ch1 ,密钥为 ch2 , 那么密文 ch3 对应的就是 ch1 在字母表中偏移 |ch2| 位, 例如 \(\tex

【NOIP 2014 DAY1 T3】飞扬的小鸟(DP)

题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败. 为了简化问题,我们对游戏规则进行了简化和改编: 游戏界面是一个长为n ,高为 m 的二维平面,其中有k 个管道(忽略管道的宽度). 小鸟始终在游戏界面内移动.小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成. 小鸟每个单位时间沿横坐标方向右移的距离为1 ,竖直移动

codevs 1199 开车旅行 2012年NOIP全国联赛提高组

1199 开车旅行 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即d[i, j] = |Hi − Hj|. 旅行过程中,小A 和小B轮流开

NOIP 2012 提高组 DAY1 T2 国王游戏

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少

noip2012 开车旅行

P1081 开车旅行 139通过 484提交 题目提供者洛谷OnlineJudge 标签倍增2012NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi− Hj|. 旅行过程中,小

[NOIP2012] 提高组 洛谷P1081 开车旅行

题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi− Hj|. 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次.他们计划 选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行.小 A 和小 B

开车旅行

洛谷P1081 开车旅行  NOIP 2012 提高组 第一天 第三题 题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi− Hj|. 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次.他们计划 选择一个城市 S 作

【NOIP2012】开车旅行

题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi? Hj|. 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次.他们计划 选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行.小 A 和小 B