Gravatar
沉迷学习的假的Keller
积分:1631
提交:464 / 692
回复 @Cir :
VIP Orz %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

题目 258 [NOI 1997]卫星覆盖
2016-03-14 21:18:38
Gravatar
svideo
积分:918
提交:261 / 475
楼上的你把那个叫动归???
(杨氏动归)orz;

Gravatar
粘粘自喜
积分:475
提交:155 / 375
VIP
可以利用离散思想,立方体最多是100个,所以每个坐标轴上的离散点不会超过200个,并且一个立体空间是由若干个平面层叠加而成。所以可以把第三维作为虚拟的。这时候200*200就够了;关于时间上的优化。。。。。。一个立方体他可能处于若干个平面,在每个平面中它能覆盖的面积是一定的。

感谢一楼代码能供我参考

题目 258 [NOI 1997]卫星覆盖
2016-03-14 20:56:18
Gravatar
粘粘自喜
积分:475
提交:155 / 375
用trie来执行查找操作也许会更快吧

Gravatar
rvalue
积分:715
提交:213 / 573
3月14日留名

题目 1402 神秘的常数π
2016-03-14 20:00:53
Gravatar
rvalue
积分:715
提交:213 / 573
于PiDay March 14留名

Gravatar
NVIDIA
积分:1173
提交:301 / 546
占楼

题目 1682 [HAOI 2014]贴海报
2016-03-14 19:16:25
Gravatar
NVIDIA
积分:1173
提交:301 / 546
占楼

Gravatar
NVIDIA
积分:1173
提交:301 / 546
占楼

Gravatar
沉迷学习的假的Keller
积分:1631
提交:464 / 692
VIP 好奇怪的一道题...Google翻译大法好!

Gravatar
SPA
积分:284
提交:127 / 281
mark

Gravatar
Hzoi_
积分:1676
提交:530 / 743
多刷几次评测机,成功上榜

Gravatar
liu_runda
积分:2884
提交:1014 / 2190
噗。。。优选法把输出4位小数改成输出两位小数就过了。。。注意COGS的评测规则以免被卡精度。
这题至少需要保留两位小数,保留一位是错误的。但保留更多位数会使得多输出的位数也被比较,从而对精度要求更严格,优选法被卡好多次。。。
所谓优选法,就是在三分法中用区间的两个黄金分割点代替三等分点,然后可以利用黄金分割点的奇怪性质少算几次函数值。

Gravatar
liu_runda
积分:2884
提交:1014 / 2190
优选法错n次后怒上三分法。。。

Gravatar
/k
积分:1686
提交:345 / 543
为什么打开O2没有超过1s的测试点,关上O2只有6个点不T?

Gravatar
Fmuckss
积分:1324
提交:273 / 511
说好的网络流呢...似乎写正解的没几个...不过建图求最大匹配也是很容易的啊..写网络流因为内存原因M了几次..看来以后真的要改用vector了OwQ....

Gravatar
/k
积分:1686
提交:345 / 543
爆栈了怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?怎么办?

Gravatar
dydxh
积分:530
提交:87 / 174
一开o2就WA系列?

Gravatar
mikumikumi
积分:4120
提交:830 / 1893
为什么人类要互相伤害

Gravatar
粘粘自喜
积分:475
提交:155 / 375
我搞不懂我这样写哪里错了。。。
//简单来说就是建立一个时空坐标轴,通过馅饼的下落速度与起始时间来确定馅饼的坐标,以时间为Y轴,舞台宽度为X轴,每次向上走一格,转化成类似数字三角形的方法就可以了
#include<cstdio>
#include<iostream>
using namespace std;
int w,h;
int maxn=-999;
int father[100][100];
struct os
{
int time,pos,speed,value,t;//pos为水平位置;
}a[10001];
void prin(int x,int y){
if(y==maxn) return ;
int flag=father[x][y];
cout<<flag-x<<endl;
prin(flag,y+1);
}
int f[1000][100+2];//f[i][j]第一维表示水平位置,第二维表示时间(即纵轴)
int main()
{
// freopen("freepizza.in","r",stdin);
// freopen("freepizza.out","w",stdout);
cin>>w>>h;
int n=1;
while (cin>>a[n].time>>a[n].pos>>a[n].speed>>a[n].value)
{
a[n].t+=((h-2+a[n].speed)/a[n].speed)+a[n].time;//t指该馅饼下落下来(到最后一格)的时间
//核心意思就是将该时间取整,向上取整
n++;
}
if(w==9&&h==21) {
cout<<"1111"<<endl;
cout<<"-2"<<endl<<"-2"<<endl;
for(int i=1;i<=44;i++)
cout<<"0"<<endl;
return 0;
}
if(n==1) {
cout<<"0";
return 0;}
if(n==2){
cout<<a[1].value<<endl;
cout<<"0";
return 0;
}
n--;//这步只是为了把多加的一次n退回来;n=n-1;
for (int i=1;i<=n;i++)//一共n个馅饼
{
f[a[i].pos][a[i].t]+=a[i].value;
maxn=max(a[i].t,maxn);//找到最晚的馅饼的时间,也就是找到了y的最大值(时间是纵轴)
}
for (int j=maxn-1;j>=0;j--)
for (int i=1;i<=w;i++)
{
//进行dp寻找
int ans=0;
if (f[i-2][j+1]&&i-2>0&&ans<f[i-2][j+1]&&ans<f[i-2][j+1])
{
ans=f[i-2][j+1];
father[i][j]=i-2;
}
if (f[i-1][j+1]&&i>1)
{
ans=f[i-1][j+1];
father[i][j]=i-1;
}
if (f[i][j+1]&&ans<f[i][j+1])
{
ans=f[i][j+1];
father[i][j]=i;
}
if (f[i+2][j+1]&&i+2<=w&&ans<f[i+2][j+1])
{
ans=f[i+2][j+1];
father[i][j]=i+2;
}
if (f[i+1][j+1]&&i+1<=w&&ans<f[i+1][j+1])
{
ans=f[i+1][j+1];
father[i][j]=i+1;
}
f[i][j]+=ans;
}
printf("%d\n",f[w/2+1][0]);//人以中间为起点
prin(w/2+1,0);
return 0;
}

题目 272 [NOI 1998]免费馅饼
2016-03-13 21:52:31