2013ACM/ICPC长沙邀请赛G题 (求解)

本文深入探讨了游戏开发领域的关键技术,包括游戏引擎、编程语言、硬件优化等,并结合AI音视频处理技术,展示如何在游戏场景中应用这些技术提升用户体验。文章详细分析了Unity、Cocos2d-X等游戏引擎的特点与优势,同时阐述了AI在游戏中的应用,如智能NPC、语音识别、视觉特效等,以及音视频处理技术在游戏直播、实时交互等方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      首先来总结一下:此次湖大之行可谓是惨不忍睹!虽然全程5个小时,虽然没有浪费什么,可是没拿到一个Accept!忘掉悲伤,继续前行。经历过失败,站起来,下一次不会在同一个地方跌倒,前行的路上难免有磕磕绊绊,其实最能让人回忆的是那些泪水 和 欢笑。

     下面步入主题:

Problem G
    Travel in time
Description
Bob gets tired of playing games, leaves Alice, and travels to Changsha alone.
Yuelu Mountain , Orange Island, Window of the World, the Provincial Museum
etc...are scenic spots Bob wants to visit. However, his time is very limited, he can’t
visit them all.
Assuming that there are N scenic spots in Changsha, Bob defines a satisfaction
value Si to each spot. If he visits this spot, his total satisfaction value will plus Si. Bob
hopes that within the limited time T, he can start at spot S, visit some spots selectively,
and finally stop at spot E, so that the total satisfaction value can be as large as possible.
It's obvious that visiting the spot will also cost some time, suppose that it takes Ci
units of time to visit spot i ( 0 <= i < N ).
Always remember, Bob can choose to pass by a spot without visiting it (including
S and E), maybe he just want to walk shorter distance for saving time.
Bob also has a special need which is that he will only visit the spot whose
satisfaction value is strictly larger than that of which he visited last time. For example,
if he has visited a spot whose satisfaction value is 50, he would only visit spot whose
satisfaction value is 51 or more then. The paths between the spots are bi-directional,

of course.

Input
The first line is an integer W, which is the number of testing cases, and the W sets
of data are following.
The first line of each test data contains five integers: N M T S E. N represents the
number of spots, 1 < N < 100; M represents the number of paths, 0 < M < 1000; T
represents the time limitation, 0 < T <= 300; S means the spot Bob starts from. E
indicates the end spot. (0 <= S, E < N)
The second line of the test data contains N integers Ci ( 0 < Ci <= T ), which
means the cost of time if Bob visits the spot i .
The third line also has N integers, which means the satisfaction value Si that can
be obtained by visiting the spot i ( 0 <= Si < 100 ).
The next M lines, each line contains three integers u v L, means there is a
bi-directional path between spot u and v and it takes L units of time to walk from u to
v or from v to u. (0 <= u, v < N, 0 < L <= T)

Output
Output case number in the first line (formatted as the sample output).
The second line contains an integer, which is the greatest satisfaction value.
If Bob can’t reach spot E in T units of time, you should output just a “0” (without
quotation marks).

Sample Input
14
4 22 0 3
1 1 1 1
5 7 9 12
0 1 10
1 3 10
0 2 10
2 3 10
Sample Output
Case #1:
21


我的思路:

Bob要游玩长沙的一些scenic(景点)总数是N,(0<N<100) 起点是S,必须到达终点E。

   由于时间有限,bob只选择性的游玩一些景点。当他游玩游景点时,会获得相应的满意价值。

但他有两个要求:

1.Bob给每一个景点定义了一个满意价值,

Bob在游玩时,他到达的下一个景点的满意值必须大于当前景点的满意值,(可以理解为bob旅游景点的满意值是一个严格递增

2.游玩一个景点需要花费一定时间,bob为了走更短的路,他可以经过某个景点但不游玩,于是他得不到这个景点的满意价值。

求bob可能得到的最大满意价值。并按照样例输出。

注意:如果bob无法在时间T内达到E景点,那么他的满意价值为0.
序列)。

下面来看一下测试用例:


bob 有两条路线:A  0——>1——>3  和B  0——>2——>3  每条边的时间消耗是10个时间单位,每个顶点时间消耗是1个时间单位,在22个时间单位内,A路线获得的最大值是19.B路线获得的最大值是21.

我的思路是:

¡1.找一条S—>E的路,这条路满意度严格递增,路上耗费的总时间t不大于(<=)T,(T是时间限制).
  2.对于找到的这条路,可以用最多T-t的时间去游玩景点。

  景点有两个属性: 时间花费满意价值,这个景点可以游玩也可以略过,由此很自然想到,属于01背包问题


代码如下:

不知道哪里出问题了,就是提交不对!!请各位大哥指出!感激不尽

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>


using namespace std;
#define M 102


int v[M],t[M];
int mymap[M][M];
int n,m,T,s,e;
vector<int>q;//存储路径
int vis[M];
int maxvalue;
int dp[302];//背包
void solve(int cap)//01背包 求该路径上的最大满意价值
{
   memset(dp,0,sizeof(dp));
   for(int i=0;i<q.size();i++)
   for(int time=cap;time>=t[ q[i] ];time--)
      dp[time]=max(dp[time-t[ q[i] ]]+v[q[i]],dp[time]);


   maxvalue=max(maxvalue,dp[cap]);
}
void myprint()
{
   printf("*********\n");
   for(int i=0;i<q.size();i++)
      printf("%d ",q[i]);
   printf("\n");
}
void dfs(int x,int time)
{
   q.push_back(x);
   vis[x]=1;//结点标记已访问
   if(x==e)
   {
      //myprint();
      solve(T-time);
      return ;
   }
   for(int i=0;i<n;i++)
   if(!vis[i]&&mymap[x][i]&&v[x]<v[i]&&mymap[x][i]+time<=T)
   {
      dfs(i,mymap[x][i]+time);
      vis[i]=0;
      q.pop_back();
   }


}
int main()
{
    int w,i,j,uu,vv,l,cases=1;
    scanf("%d",&w);
    while(w--)
    {   //    n景点数,m边数,T 是时间限制,s起点,e终点
       scanf("%d%d%d%d%d",&n,&m,&T,&s,&e);
       for(i=0;i<n;i++)//每个景点游玩需要的时间
         scanf("%d",&t[i]);
       for(i=0;i<n;i++)//每个景点获得的 满意价值
         scanf("%d",&v[i]);
       memset(mymap,0,sizeof(mymap));
         for(i=0;i<m;i++)
         {
            scanf("%d%d%d",&uu,&vv,&l);
            if(mymap[uu][vv]==0||mymap[uu][vv]>l)
             mymap[uu][vv]=mymap[vv][uu]=l;
         }
        maxvalue=0;//最大价值初始化为0
        memset(vis,0,sizeof(vis));
        q.clear();
        dfs(s,0);
       printf("Case #%d:\n%d\n",cases++,maxvalue);//输出最大的满意价值
    }
    return 0;
}




/*
1
4 4 22 0 3
1 1 1 1
5 7 9 12
0 1 10
0 2 10
1 3 10
2 3 10
*/







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值