CCF-CSP_201609(第8次)

1. 最大波动


//水题
#include<iostream>
using namespace std;
const int inf=999999999;
int main(){
    int n,max=-inf,pre,now;
    scanf("%d",&n); //n>=2
    for(int i=0;i<n;i++){
        scanf("%d",&now);
        if(i!=0&&max<abs(now-pre))
            max=abs(now-pre);
        pre=now;
    }
    printf("%d\n",max);
    return 0;
}

2. 火车购票


#include<iostream>
using namespace std;
int a[20],R,t;//a[]值表示一排已做的人数
void ins(int r){//在指定排数开始在空格中插入
    for(int i=r;t>=1;i++)
        while (a[i]<5&&t>=1) {
            cout<<r*5+a[i]+1<<" ";
            a[i]++;
            t--;
        }
}
int main(){
    int n,flag=0;
    
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&t);
        for(int r=0;r<20;r++){
            if(a[r]<5&&flag==0)//第一行有空格
                R=r;
            if(a[r]<=5-t){//第一行可以放一排
                R=r; break;
            }
        }
        ins(R); cout<<endl;
    }       
    return 0;
}
 4
 2 5 4 2
 
 1 2
 6 7 8 9 10
 11 12 13 14
 3 4

3. 炉石传说


/* CCF201609-3 炉石传说 */
#include <iostream>
#include <vector>
#include <string>
#define OPONENT 1-player
using namespace std;
const int RED = 0;// 红黑双方,红先黑后
const int BLACK = 1;
 
struct status {// 状态:包括生命值和攻击力
    int life, power;
    status(int l, int p){life = l; power = p;}
};
 
// 变量v用于存储英雄和随从的状态:v[0]为红方,v[1]为黑方
// 向量v[RED]和v[BLACK]中分别存储双方的英雄和随从的状态
// v[RED][0]存储红方英雄的状态,v[RED][1]-v[RED][7]存储随从的状态
vector<status> v[2];
 
int main()
{
    int n, player=RED;
    string action;
    int position, attack, health;//position 1~7
    int attacker, defender;
 
    // 变量初始化:英雄在向量v中的位置为0,1
    v[RED].push_back(status(30, 0));
    v[BLACK].push_back(status(30, 0));
 
    cin >> n;
    while(n--) {
        cin >> action;
        if(action == "summon") {
            cin >> position >> attack >> health;
            v[player].insert(v[player].begin() + position, status(health, attack));
        } else if(action == "attack") {
            cin >> attacker >> defender;
            // 当随从攻击时,攻击方和被攻击方会同时对彼此造成等同于自己攻击力的伤害。
            // 受到伤害的角色的生命值将会减少,数值等同于受到的伤害。
            v[player][attacker].life -= v[OPONENT][defender].power;
            v[OPONENT][defender].life -= v[player][attacker].power;
            if(v[player][attacker].life <= 0)// 攻击方的随从生命结束则移除
                v[player].erase(v[player].begin() + attacker);
            if(defender != 0 && v[OPONENT][defender].life <= 0)// 防御方的随从生命结束则移除
                v[OPONENT].erase(v[OPONENT].begin() + defender);
        } else if(action == "end") {
            player = OPONENT;
        }
    }
 
    // 第1行
    if(v[RED][0].life <=0) cout << -1 << endl;
    else if(v[BLACK][0].life <=0) cout << 1 << endl;
    else cout << 0 << endl;
    // 第2行
    cout << v[RED][0].life << endl;
    // 第3行
    cout << v[RED].size() - 1;
    for(int i=1; i<(int)v[RED].size(); i++)
        cout << " " << v[RED][i].life;
    cout << endl;
    // 第4行
    cout << v[BLACK][0].life << endl;
    // 第5行
    cout << v[BLACK].size() - 1;
    for(int i=1; i<(int)v[BLACK].size(); i++)
        cout << " " << v[BLACK][i].life;
    cout << endl;
 
    return 0;
}
8
summon 1 3 6
summon 2 4 2
end
summon 1 4 5
summon 1 2 1
attack 1 2
end
attack 1 1
 
0
30
1 2
30
1 2

4. 交通规划


/* CCF201609-4 交通规划 */
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INT_MAX2 = ((unsigned int)(-1) >> 1);
const int MAXN = 10000;
 
struct edge {// 边
    int v, cost;
    edge(int v2, int c){v=v2; cost=c;}
};
 
struct node {// 结点
    int u, cost;
    node(){}
    node(int u2, int c){u=u2; cost=c;}
 
    bool operator<(const node n) const {
        return cost > n.cost;
    }
};
 
vector<edge> g[MAXN+1];
priority_queue<node> q;
int dist[MAXN+1];
int cost[MAXN+1];
bool visited[MAXN+1];
 
void dijkstra_add(int start, int n)
{
    for(int i=0; i<=n; i++) {
        dist[i] = INT_MAX2;
        cost[i] = INT_MAX2;
        visited[i] = false;
    }
 
    dist[start] = 0;
    cost[start] = 0;
 
    q.push(node(start, 0));
    node f;
    while(!q.empty()) {
        f = q.top();
        q.pop();
 
        int u = f.u;
        if(!visited[u]) {
            visited[u] = true;
 
            int len = (int)g[u].size();
            for(int i=0; i<len; i++) {
                int v2 = g[u][i].v;
 
                if(visited[v2])
                    continue;
 
                int tempcost = g[u][i].cost;
                int nextdist = dist[u] + tempcost;
 
                if(dist[v2] > nextdist) {
                    dist[v2] = nextdist;
                    cost[v2] = tempcost;                   // add code
                    q.push(node(v2, dist[v2]));
                } else if(dist[v2] == nextdist)
                    cost[v2] = min(cost[v2], tempcost);    // add code
            }
        }
    }
}
 
int main()
{
    int n, m,ans=0;
 
    cin >> n >> m;//城市数、边数
    for(int i=1; i<=m; i++) {
        int u,v,cost;
        cin >> u >> v >> cost;
        g[u].push_back(edge(v, cost));
        g[v].push_back(edge(u, cost));
    }
 
    dijkstra_add(1, n);  // 改进的Dijkstra算法
 
#ifdef DEBUG
    cout << "dist : ";
    for(int i=1; i<=n; i++)
        cout << dist[i] << " ";
    cout << endl;
 
    cout << "cost : ";
    for(int i=1; i<=n; i++)
        cout << cost[i] << " ";
    cout << endl;
#endif
    for(int i=2; i<=n; i++)
        ans += cost[i]; // 统计边的权重
    cout << ans << endl;
 
    return 0;
}
4 5
1 2 4
1 3 5
2 3 2
2 4 3
3 4 2
 
dist : 0 4 5 7
cost : 0 4 5 2
11
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值