您的位置:首页 > 其它

9.26 noip模拟试题

2016-09-26 21:06 363 查看
魔术球问题弱化版(ball.c/.cpp/.pas)

题目描述

假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的球。

(1)每次只能在某根柱子的最上面放球。

(2)在同一根柱子中,任何 2 个相邻球的编号之和为完全平方数。

试设计一个算法,计算出在 n 根柱子上最多能放多少个球。例如,在 4 根柱子上最多可放 11 个球。

对于给定的 n,计算在 n 根柱子上最多能放多少个球。

输入描述

第 1 行有 1 个正整数 n,表示柱子数。

输出描述

一行表示可以放的最大球数

4

样例输出。

样例输入

11

题目限制(为什么说弱化版就在这里)

N<=60,时限为3s;比起原题还有弱化在不用打出方案,方案太坑了

数据小,直接打表..

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 10010
#define ll long long
using namespace std;
ll n,m,num1,num2,num,head1[maxn],head2[maxn],head[maxn],dis1[maxn],dis2[maxn],dis[maxn],f[maxn];
ll u[maxn*10],v[maxn*10],t1[maxn*10],t2[maxn*10];
queue<ll>q;
struct node{
ll u,v,t,pre;
}e1[maxn*10],e2[maxn*10],e[maxn*10];
ll init(){
ll x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
}
void Add1(ll from,ll to,ll dis){
num1++;e1[num1].u=from;
e1[num1].t=dis;
e1[num1].v=to;
e1[num1].pre=head1[from];
head1[from]=num1;
}
void Add2(ll from,ll to,ll dis){
num2++;e2[num2].u=from;
e2[num2].t=dis;
e2[num2].v=to;
e2[num2].pre=head2[from];
head2[from]=num2;
}
void SPFA1(){
memset(dis1,127/3,sizeof(dis));
q.push(n);f
=1;dis1
=0;
while(!q.empty()){
int k=q.front();
q.pop();f[k]=0;
for(int i=head1[k];i;i=e1[i].pre){
int v=e1[i].v;
if(dis1[v]>dis1[k]+e1[i].t){
dis1[v]=dis1[k]+e1[i].t;
if(f[v]==0){
f[v]=1;q.push(v);
}
}
}
}
}
void SPFA2(){
memset(f,0,sizeof(f));
memset(dis2,127/3,sizeof(dis));
while(!q.empty())q.pop();
q.push(n);f
=1;dis2
=0;
while(!q.empty()){
int k=q.front();
q.pop();f[k]=0;
for(int i=head2[k];i;i=e2[i].pre){
int v=e2[i].v;
if(dis2[v]>dis2[k]+e2[i].t){
dis2[v]=dis2[k]+e2[i].t;
if(f[v]==0){
f[v]=1;q.push(v);
}
}
}
}
}
ll Solve(){
memset(f,0,sizeof(f));
memset(dis,127/3,sizeof(dis));
while(!q.empty())q.pop();
q.push(1);f[1]=1;dis[1]=0;
while(!q.empty()){
int k=q.front();
q.pop();f[k]=0;
for(int i=head[k];i;i=e[i].pre){
int v=e[i].v;
if(dis[v]>dis[k]+e[i].t){
dis[v]=dis[k]+e[i].t;
if(f[v]==0){
f[v]=1;q.push(v);
}
}
}
}
return dis
;
}
int main()
{
freopen("gpsduel.in","r",stdin);
freopen("gpsduel.out","w",stdout);
n=init();m=init();
for(ll i=1;i<=m;i++){
u[i]=init();v[i]=init();t1[i]=init();t2[i]=init();
Add1(v[i],u[i],t1[i]);Add2(v[i],u[i],t2[i]);
}
SPFA1();
SPFA2();
for(ll i=1;i<=m;i++){
e[i].v=v[i];e[i].pre=head[u[i]];head[u[i]]=i;
if(dis1[v[i]]+t1[i]>dis1[u[i]])e[i].t++;
if(dis2[v[i]]+t2[i]>dis2[u[i]])e[i].t++;
}
cout<<Solve()<<endl;
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: