思路: 从高位开始能减成9就先减, 减不了就尽可能地加
范围大用的字符串
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;
}
Dijkstra
我这里把点权加在了边权的末端, 并让到"1"和到"n"的末端点权为0
没用堆优化,不知道会不会tle
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;
}
总结: 一个多月没练, 寄了