ACM-ICPC 2018 沈阳赛区网络预赛(D,K)

D

#include <bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"-------"<<endl

typedef  long long ll;
const int maxn = 1e5 + 10;
const int MAXN = 1e6 +10;
const int INF = 0x3f3f3f3f;
const int N = 1010;

int n, m, x, xf;
int head[MAXN], headf[MAXN], dis[MAXN], cnt[MAXN];
bool vis[MAXN];
struct node{
    int v, dis, f, Next;
    friend bool operator < (node a,node b) {
        return a.f>b.f;
    }
};
node edge[MAXN], edgef[MAXN];

void add(int u, int v, int dis){
    edge[x].v = v;
    edge[x].dis = dis;
    edge[x].Next = head[u];
    head[u] = x;
    edgef[x].v = u;
    edgef[x].dis = dis;
    edgef[x].Next = headf[v];
    headf[v] = x++;
}

void spfa(int s, int t){
    int u, v, i, j;
    queue<int> q;
    clr(vis); clr(cnt);
    for(i=0; i<=n; ++i) dis[i] = INF;
    vis[s] = 1; dis[s] = 0;
    q.push(s);
    while(!q.empty()){
        u = q.front();
        q.pop();
        vis[u] = 0;
        cnt[u]++;
        if(cnt[u] >= n) return ;
        for(j = headf[u]; ~j; j = edgef[j].Next){
            if(dis[v=edgef[j].v] > dis[u]+edgef[j].dis){
                dis[v] = dis[u] + edgef[j].dis;
                if(!vis[v]) {
                    vis[v] = 1;
                    q.push(v);
                }
            }
        }
    }
}
int A_star(int s,int t,int k){
    int cnt = 0, i;
    node e, next;
    priority_queue<node> q;
    if(s == t) k++;
    if(dis[s] == INF) return -1;
    e.v = s; e.dis = 0; e.f = dis[s]; q.push(e);
    while(!q.empty()){
        e = q.top();
        q.pop();
        if(e.v == t && ++cnt == k) return e.dis;
        for(i = head[e.v]; ~i; i=edge[i].Next){
            next.v = edge[i].v;
            next.dis = e.dis + edge[i].dis;
            next.f = next.dis + dis[next.v];
            q.push(next);
        }
    }
    return -1;
}
int main(){
    while(scanf("%d%d", &n, &m) != EOF){
        clr(edge); clr(edgef); clr(dis);
        int s, t, k, Ti;
        scanf("%d%d%d%d", &s, &t, &k, &Ti);
        memset(head,-1, sizeof(head));
        memset(headf,-1, sizeof(headf));
        int u, v, x;
        for (int i = 0; i <m ; ++i) {
            scanf("%d%d%d", &u, &v, &x);
            add(u, v, x);
        }
        spfa(t, s);
        int T = A_star(s, t, k);
        if(T > Ti || T == -1) puts("Whitesnake!");
        else puts("yareyaredawa");
    }
    return 0;
}

K

#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"------------"<<endl

typedef long long ll;
const int maxn = 1e5+10;
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int N = 110;

int pre[] = {1, 2, 3, 5, 7, 11, 13, 17, 23, 31, 37, 53, 71, 73, 113, 131, 137, 173, 311, 317};
char s[maxn];

int main(){
    int t, cas = 1;
    scanf("%d", &t);
    while(t--){
        scanf("%s", s);
        int len = strlen(s);
        printf("Case #%d: ", cas++);
        if(len >= 4) {
            puts("317");
        }
        else{
            int p = 0;
            for(int i=0; i<len; i++){
                p = p*10 + (s[i]-'0');
            }
            int pos = lower_bound(pre, pre+20, p) - pre;
            if(p != pre[pos]) pos--;
            printf("%d\n", pre[pos]);
        }
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值