E.恋与程序员
链接:https://www.nowcoder.com/acm/contest/67/E
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
马云:“哈哈,女生的钱最好赚了!”
叠纸:“马云说得对!”
腾讯:“哇!真的耶!求代理!”
小P眼一眯,嘴角一挑,似乎发现了商机。不就是抽卡过关看CG么,我也能做啊!于是乎,一个月后,一款《恋与程序员》诞生了。
游戏里设置了n个事件,m个关卡,k张卡片。每一个事件都有一张独一无二的CG,但是每个关卡,都需要拥有特定的卡片才能通关。从一个事件,触发另一个事件,需要通过一个特定的关卡。我们给事件编号为1~n,对应的CG编号与事件的编号一致。卡片编号为1~k。一开始,玩家会触发事件1,并拿到1号CG,但是从此之后,玩家如果想触发别的事件,便要通过闯关来达到。
现在,小Q想要c号CG(触发c号事件获得),但是小Q却又不想花太多的钱。于是小Q查了攻略,以事件为点,关卡为边,作了一张图,并且小Q知道每个关卡都需要什么卡片以及卡片的售价。请你计算一下,小Q拿到c号CG,至少要花多少钱。
注意,过关并不需要消耗卡片,同一张卡片可以通关多次。
输入描述:
数据有多组,处理到文件结束。
每组数据第一行有四个整数n,m,k,c,代表事件数量、关卡数量、卡片数量以及小Q想要的CG的编号。
接下来m行,每行三个整数u,v,e,代表从u号事件可以通过闯关触发v号事件,并且需要e号卡片。
接下来k行,每行两个整数a,b,代表a号卡片的售价是b。
输出描述:
每组数据输出一行,一个整数,代表小Q拿到c号CG的最小花费。
示例1
输入
6 7 5 6
2 3 2
4 3 3
1 2 1
1 5 4
4 6 5
1 4 2
5 6 3
1 100
3 422
2 210
5 107
4 38
输出
317
备注:
对于100%的数据,
1 <= n,m,k <= 100;
1 <= u,v <= n;
1 <= a,c,e <= k;
1 <= b <= 1000。
模拟栈的一道题。当速度大于上一速度全部出栈,按出栈顺序完成功能。(栈+模拟)
#include<bits/stdc++.h>
#define PI 3.1415926
#define INF 1e18
#define inf 1e9
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
const ll _max = 105;
int M[_max][_max];
int p[_max];
bool pv[_max];
int n,m,k,c,ans;
void dfs(int x,int cnt){
if(x==c){
ans = min(ans,cnt);
return ;
}
for(int i = 2 ; i <= n ; i++){
if(!M[x][i]) continue;
if(pv[M[x][i]]){
pv[M[x][i]] = false;
dfs(i,cnt+p[M[x][i]]);
pv[M[x][i]] = true;
}
else dfs(i,cnt);
}
}
int main(){
while(cin>>n>>m>>k>>c){
ans = inf;
memset(M,0,sizeof(M));
memset(pv,true,sizeof(pv));
for(int i = 1 ; i <= m ; i++){
int a,b,e;
cin>>a>>b>>e;
M[a][b] = e;
}
for(int i = 1 ; i <= k ; i++){
int a,b;
cin>>a>>b;
p[a]=b;
}
dfs(1,0);
cout<<ans<<endl;
}
return 0;
}
F.大吉大利,今晚吃鸡——跑毒篇
链接:https://www.nowcoder.com/acm/contest/67/F
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
现在有一款很火的游戏playerunknown’s battlegrounds,人称“吃鸡”,在里面经常面临跑毒(从安全区外跑进安全区内)的问题,在安全区外,人们会处于中毒状态,每秒会掉a%血,人们可以通过使用道具急救包把血量升回到80%,使用急救包需要原地站着6秒。现在知道在安全区外扣血速度为a%/s,角色和安全区的距离为b米,角色跑步速度为1m/s,角色有c个急救包,请问角色是否能安全跑进安全区内。(PS:角色开始的血量为100%。如果血量降到0%,立刻判定为死亡。使用急救包时,如果刚使用完毕瞬间或者正在使用急救包的时候,血量降到0%,角色立即判定为死亡。顺带一提,这里判断时间不存在0.xxxx秒,最小时间单位为1s)
输入描述:
第一行是样例数T(T<9)
第2到2+T-1行每行有三个整数a b c,其中a为安全区外的扣血速度a%/s,b为角色和安全区的距离,c为急救包的数量。
输出描述:
如果角色能进入安全区输出“YES”。
若角色在安全区外死亡输出“NO”。
示例1
输入
3
1 100 2
6 31 2
7 31 2
输出
YES
YES
NO
说明
当a=6,b=31,c=2时,
0s起跑,10s的时候角色跑了10M,血量剩下40%,开始使用急救包,16s的时候,角色血量先降到4%再恢复到80%,然后角色继续跑步。23s的时候,角色跑了17M,剩余血量为38%,开始使用急救包,29s的时候,角色血量先降到2%再恢复到80%,然后角色继续跑步。42s的时候,角色跑了30m,血量剩余2%。当43s的时候,角色跑了31m进入了安全区内,不再扣血。
备注:
对于100%的数据,
1 <= T < 9;
0 < a <= 20;
0 < b <= 120;
0 <= c <= 8。
这个数据小,可以模拟,也可以写数学公式无所谓了
#include<bits/stdc++.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PI 3.1415926
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
int main(){
int t,a,b,c;
cin>>t;
while(t--){
cin>>a>>b>>c;
int l = 100;
int max;
max = (100-(1+6*a))/a;
if(c>=1){
max += (c-1)*(80-(1+6*a))/a;
max += 79/a;
}
else max += (6*a+(100-(1+6*a))%a)/a;
max++;
if(max >= b) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}