0
点赞
收藏
分享

微信扫一扫

第十三届蓝桥杯c++B组国赛 D E

第十三届蓝桥杯c++B组国赛 D E_ios

第十三届蓝桥杯c++B组国赛 D E_蓝桥杯_02 

思路: 从高位开始能减成9就先减, 减不了就尽可能地加

范围大用的字符串

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

string s;
int a, b;
int main()
{
cin >> s >> a >> b;
int len = s.size();

for(int i = 0; i < len; i ++){
if(b >= s[i]-'0'+1){
b -= s[i]-'0'+1;
s[i] = '9';
}else{
int d = min(a, 9-s[i]+'0');
a -= d;
s[i] = s[i]+d;
}
}
cout << s;
return 0;
}

第十三届蓝桥杯c++B组国赛 D E_c++_03

第十三届蓝桥杯c++B组国赛 D E_c++_04Dijkstra

我这里把点权加在了边权的末端, 并让到"1"和到"n"的末端点权为0

没用堆优化,不知道会不会tle

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

const int N = 1010;
int n, m;
int dist[N], g[N][N], wait[N];
bool st[N];


int dijkstra()
{
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;

for(int i = 0; i <= n ; i ++)
{
int t = -1;
for(int j = 1; j <= n; j ++)
if(!st[j] && (t==-1 || dist[j]<dist[t]))
t = j;

st[t] = true;
for(int j = 1; j <= n; j ++){
dist[j] = min(dist[j], dist[t]+g[t][j]);
}
}
//if(dist[n] == 0x3f3f3f3f) return -1;
return dist[n];
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++) scanf("%d", &wait[i]);
wait[1] = 0;
wait[n] = 0;
memset(g, 0x3f, sizeof g);

int a, b, c;

for(int i = 0; i < m; i ++)
{
scanf("%d%d%d", &a, &b, &c);
g[a][b] = c+wait[b];
g[b][a] = c+wait[a];
}

printf("%d", dijkstra());
return 0;
}

 

总结: 一个多月没练, 寄了


举报

相关推荐

0 条评论