0804笔试回忆

1. 咖啡的香气

题目描述

小杰有N个bug没修,假设每喝一杯咖啡,就能让自己一个小时内的debug效率提升到原来的A倍,一小时内重复喝没用,最多只能喝X杯,每天只能工作8小时,而在没喝咖啡的状态下解决每个bug所需要的时间为t1,t2,...,tN分钟

输入

8 2 8
60 60 60 60 60 60 60 60
4 3 3
333 77 100 13

输出

240
175

#include <iostream>
using namespace std;

int C[105];
int main(){
    int N,A,X;
    while(scanf("%d%d%d", &N, &A, &X) != EOF){
        //cin>>N>>A>>X;
        int sum = 0;
        for (int i=0; i<N; i++){
            cin>>C[i];
            sum += C[i];
        }
        int cost = 0;
        if (sum <= X * A * 60){
            cost = sum  % A ==0?(sum / A):(sum / A)+1;
            cout<<cost<<endl;
        }else{
            cost = sum - X*A*60 + X*60;
            if (cost > 8*60){
                cout<<"0"<<endl;
            }else{
                cout<<cost<<endl;
            }
        }
    }
    
    return 0;
}

2. 应该吃哪个呢?

题目描述

小A是一个大吃货,但为了减肥,每次只能买总价格少于V的零食。对于每种零食,有价格v、满意度l、数量c,零食只能整数倍购买,不能买半件,问在有限的价格内小A买到的零食的总满意度最高是多少?

输入

2 10
1 1 1
1 1 1
3 100
26 100 4
5 1 4
5 2 2

输出

2
306

#include <iostream>
#include <algorithm>
using namespace std;

typedef struct node{
    int v, l;
}Node;

int dp[10005]={0};
Node C[10005]={0};
int main(){
    int N, T;
    while(scanf("%d%d", &N, &T) != EOF){
        int k=0;
        for (int i=0; i<N; i++){
            int p1, p2, p3;
            scanf("%d%d%d", &p1, &p2, &p3);
            while(p3--){
                C[k].v = p1;
                C[k].l = p2;
                k++;
            }
        }
        for (int i=0; i<=T; i++) dp[i] = 0;
        for (int i=0; i<k; i++){
            for (int j=T; j>=C[i].v; j--){
                dp[j] = max(dp[j], dp[j-C[i].v]+C[i].l);
            }
        }
        cout<<dp[T]<<endl;
    }
    return 0;
}

3. S1机器人

题目描述

比赛场地有N个路标,路标的编号从0到N-1,S1机器人只能沿直线在两个路标之间移动,且规定部分路标之间是不能移动的。
每轮比赛,S1机器人都从编号为0的路标出发,然后裁判给一个随机路标,要求S1以最快的速度到达目标位置,最终总时间最短者获胜。

输入

2 1 1
0 1 10
1
4 5 3
0 1 15
1 2 15
0 3 50
1 3 30
2 3 10
2
1
3

输出

10
85

#include <iostream>
#include <string.h>
using namespace std;

const int INF = 0x7fffffff;
const int size = 201;
int Map[size][size],dist[size];
bool vis[size];
void Dijkstra(int s, int N) ///从原点s到其他N-1个点的距离
{
    memset(vis,false,sizeof(vis));///初始化
    vis[s]=true;///s到各点距离,所以s已经被访问
    for(int i=1; i<=N; i++) ///初始化距离数组
        dist[i]=Map[s][i];
    for(int i=1; i<=N-1; i++) ///迪杰斯特拉核心语句
    {
        int minn = INF, u;///辅助变量
        for(int j=1; j<=N; j++)
        {
            if(vis[j]==0&&dist[j]<minn)
            {
                minn=dist[j];
                u=j;
            }
        }
        vis[u]=true;///为已访问
        for(int v=1; v<=N; v++)
        {
            if(Map[u][v]<INF)
            {
                if(dist[v]>dist[u]+Map[u][v])
                    dist[v]=dist[u]+Map[u][v];///松弛完成
            }
        }
    }
}

int main(){
    int N, P, C;
    while(scanf("%d%d%d", &N, &P, &C) != EOF){
        for(int i=0; i<=N; i++) ///初始化
        {
            for(int j=0; j<=N; j++)
            {
                if(i==j) Map[i][j] = 0;
                else Map[i][j] = INF;
            }
        }

        int A, B, T;
        for (int i=0; i<P; i++){
            cin>>A>>B>>T;
            Map[A+1][B+1] = T;
            Map[B+1][A+1] = T;
        }
        Dijkstra(1, N); 
        int result = 0, target;
        for (int i=0; i<C; i++){
            cin>>target;
            result += dist[target+1];
        }
        cout<<result<<endl;
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,953评论 0 2
  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 3,139评论 0 1
  • 可能,你会像爱我一样去爱别人 但是,没有人会像我一样的爱你 而我,也不会再像爱你一样去爱
    王含铎阅读 205评论 0 0
  • 边城回到鹏城已有些时日,尽管他和林夕每日都有处理不完的工作、开不完的会议,但他们二人还是尽可能的腾挪出时间同对方保...
    明明安好阅读 235评论 0 1
  • 原文:“对现在的自己来说,附着在物品上的沉重的‘执念’是不需要的。”——怀着这种态度处理杂物,会让物品和内心产生更...
    馨水宜兰阅读 403评论 0 2

友情链接更多精彩内容