【牛客】2022上海理工大学校内选拔赛(GPLT)*

A+B Problem

穿越隧道
在这里插入图片描述

思路如题意

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
// int a[N];
struct node{
    int idx;
    int v;
}a[N];
int n;
int b[N];
bool cmp(node a, node b){
    return a.v <= b.v;
}
int main(){
    scanf("%d",&n);
    for(int i = 0; i < n; i++){
        scanf("%d",&a[i].v);
        b[i] = a[i].v;
        a[i].idx = i;
    } 
    sort(a, a + n,cmp);
    for(int i = 0; i < n; i++){
//         int j = i;
        if(a[n-1].idx != i){
            b[i] += a[n - 1].v;
        }
        else{
//             j++;
            b[i] += a[n - 2].v;
        }
        
    }
    for(int i = 0; i < n; i++) printf("%d ",b[i]);
}

Komorebi的数学课

穿越隧道

快速幂模板
开始模板res写成了:res = a % q 泪目。
需反复练习

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e8;
ll n,m;
ll qmi(ll a, ll b, ll q){
    ll res = 1 % q;
    while(b){
        if(b&1){
            res = res * a % q;
        }
        a = a * a % q;
        b >>= 1;
    }
    return res;
}
int main(){
    scanf("%lld",&n);
    printf("%lld\n",qmi(n,n,n + 2));
    return 0;
}

次佛锅

穿越隧道

相同单词但大小写不同,算不同的食材。
并且,相同的食材可能多次出现,所以要累加,以及食材的数量可能是多位数,而不单单是个位数。

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4;
int n;
int q;
map<string,int> mp;
int main(){
    string s;
    getline(cin,s);
    string t ="";
    int num = 0;
    for(int i = 0; i < s.size(); i++){
        if((s[i] >='a' && s[i] <= 'z') ||( s[i] >= 'A' && s[i] <='Z')){
            t += s[i];
        }
        else if(s[i] >= '0' && s[i] <='9'){
            num = num * 10 + s[i] - '0';
//             mp[t] += (s[i] - '0');
//             t = "";
        }
        else if(s[i] ==' ' && (s[i - 1] >= '0' && s[i - 1] <='9')){
            mp[t] += num;
            num = 0;
            t ="";
        }
    }
    if(num != 0 && t != ""){
        mp[t] += num;
        t="";
        num = 0;
    }
    scanf("%d",&q);
    while(q--){
        string ss;
        cin >> ss;
        cout << mp[ss] << endl;
    }
    return 0;
}

黄金律法

在这里插入图片描述

开始,思路是对的,将a数字非降序,将b数字非升序。
因为没有将ans=0放进多组样例中,在误解题意的路上越走越远。。。菜爆了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e6;
int n,m;
int a[N];
int b[N];
int t;
ll ans;
bool cmp(int a, int b){
    return a > b;
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        ans = 0;
        for(int i = 0; i < n; i++) scanf("%d",&a[i]);
        sort(a,a + n);
        for(int i = 0; i < n; i++) scanf("%d",&b[i]);
        sort(b,b + n,cmp);
        for(int i = 0; i < n; i++){
            ans += (1ll)*(a[i] * b[i]);
        }
        printf("%lld\n",ans);
    }
    
//     printf("%lld\n",qmi(n,n,n + 2));
    return 0;
}

史东薇尔城

在这里插入图片描述

照着y总的模板写只能得90分。
发现,dis[j] > dist + w[i] 那里,需要将dist 换成dis[ver], 就过了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + 10, M = 1e8 + 10;
ll h[N],e[M],ne[M],idx,w[N];
ll dis[N];
bool st[N];
int n,m;
typedef pair<ll,ll> pii;
void add(int a, int b, int c){
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void heap_dij(){
    memset(dis,0x3f,sizeof(dis));
//     memset(st,0,sizeof(st));
    dis[1] = 0;
    priority_queue<pii,vector<pii>,greater<pii>> heap;
    heap.push({0,1});
    while(heap.size()){
        pii t = heap.top();
        heap.pop();
        int ver = t.second, dist = t.first;
        if(st[ver])continue;
        st[ver] = true;
        for(int i = h[ver]; i != -1; i = ne[i]){
            int j = e[i];
            if(dis[j] > dis[ver] + w[i]){
                dis[j] = dis[ver] + (1LL)*w[i];
                heap.push({dis[j],j});
            }
        }
    }
  
}
int main(){
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof(h));
    while(m--){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
    }
    int q;
    scanf("%d",&q);
    heap_dij();
    while(q--){
        int x, y;
        scanf("%d%d",&x,&y);
//         if(x == 1 && y == 1) puts("1");
        printf("%lld\n",(1ll)*(dis[x] + dis[y]));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值