0
0
0
0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAXN=5e5;
LL n;//格子数量
LL d;//原弹跳距离
LL k;//希望的分数
LL x[MAXN+10];//格子 i 的坐标
LL s[MAXN+10];//格子 i 的分数
LL dp[MAXN+10];//格子 i 的最大分数
void init();
bool judge(int);
void solve();
int main(){
init();
solve();
return 0;
}
void init(){
int i;
scanf("%lld%lld%lld",&n,&d,&k);
for(i=1;i<=n;++i){
scanf("%lld%lld",x+i,s+i);
}
}
bool judge(int mid){
memset(dp,-0x7f7f7f7f,sizeof(dp));
dp[0]=0;
int i,j;
LL mind=max(d-mid,1LL);
LL maxd=d+mid;
for(i=1;i<=n;++i){
for(j=i-1;j>=0;--j){
if(x[i]-x[j]>maxd)break;
if(x[i]-x[j]<mind)continue;
dp[i]=max(dp[j]+s[i],dp[i]);//dp
if(dp[i]>=k){
//mid右侧均满足最大分数 ≥k
return true;
}
}
}
return false;//mid左侧均不满足最大分数 ≥k
}
void solve(){
LL l=0,r=2010;//g的可选范围
LL mid;
//二分搜索
while(l!=r){
mid=(l+r)>>1;
//判断答案在mid左侧(true)还是右侧(false)
if(judge(mid)){
r=mid;//左侧搜索
}else{
l=mid+1;//右侧搜索
}
}
if(judge(l)){
printf("%lld",l);
}else{
//搜索完成后未找到g
printf("-1");
}
}
0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<climits>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cctype>
#define MAXA 200
#define MOD 20123
#define INF 0xffffff
using namespace std;
typedef long long LL;
int Nation,Cul,Road,Start,End;
int G[MAXA][MAXA],d[MAXA],Anti[MAXA][MAXA],Culture[MAXA],v[MAXA];
int main() {
//freopen("culture.in","r",stdin);
//freopen("culture.out","w",stdout);
scanf("%d %d %d %d %d",&Nation,&Cul,&Road,&Start,&End);
for(int i=1;i<=Nation;i++)
scanf("%d",&Culture[i]);
for(int i=1;i<=Cul;i++)
for(int j=1;j<=Cul;j++)
scanf("%d",&Anti[i][j]);
for(int i=1;i<=Nation;i++)
for(int j=1;j<=Nation;j++)
if(i != j)
G[i][j] = INF;
//G[Start][Start] = 0;
for(int i=1;i<=Road;i++) {
int u,v,d,Marku,Markv;
scanf("%d %d %d",&u,&v,&d);
if(!Anti[Culture[v]][Culture[u]]) {
G[u][v] = d;
Marku = 1;
}
if(!Anti[Culture[u]][Culture[v]]) {
G[v][u] = d;
Markv = 1;
}
if(Marku == 1)
for(int k=1;k<=Nation;k++)
if(u != k &&Culture[u] == Culture[k] && G[u][k] != INF)
G[u][k] = INF;
if(Markv == 1)
for(int k=1;k<=Nation;k++)
if(v != k && Culture[v] == Culture[k] && G[v][k] != INF)
G[v][k] = INF;
Marku = 0;
Markv = 0;
}
for(int k=Start;k<=End;k++)
for(int i=Start;i<=End;i++)
for(int j=Start;j<=End;j++)
G[i][j] = min(G[i][j],G[i][k]+G[k][j]);
if(G[Start][End] == INF)
printf("-1");
else printf("%d",G[Start][End]);
}
文化
0