C.Journey
读错题目了。。。不是无向图,结果建错图了(喵第4样例是变成无向就会有环的那种图)
并且这题因为要求路径点尽可能多
其实可以规约为限定路径长的拓扑排序,不一定要用最短路做
#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include #include #include #include #include
本文共 3058 字,大约阅读时间需要 10 分钟。
C.Journey
读错题目了。。。不是无向图,结果建错图了(喵第4样例是变成无向就会有环的那种图)
并且这题因为要求路径点尽可能多
其实可以规约为限定路径长的拓扑排序,不一定要用最短路做
#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include #include #include #include #include
D.Maxim and Array
没时间做。。。被第2、3题耽误了
试算了一下发现并不复杂。。。每次取绝对值最小的数(使其余值的乘积绝对值最大)这样对其加减时,总乘积变化也就最大
太多数了,直接乘会爆long long,直接判断负数个数(总乘积的正负性),以此判断要加要减
#include#include #include #include #include #include using namespace std;const int N = 200000 + 50;typedef long long ll;ll aabs(ll x) { return x<0 ? -x : x;}struct node{ ll num; int id; bool operator < (const node & temp) const { return aabs(num) > aabs(temp.num); }};ll a[N];ll n,k,x;int main(){ cin >> n >> k >> x; int sign = 1; priority_queue Q; for(int i=1;i<=n;i++) { scanf("%I64d",a+i); if(a[i] < 0) sign = -sign; Q.push((node){a[i],i}); } while(k--) { node temp = Q.top();Q.pop(); if(a[temp.id] < 0) { if(sign == -1) a[temp.id] -= x; else a[temp.id] += x; if(a[temp.id] >= 0) sign = -sign; } else { if(sign == -1) a[temp.id] += x; else a[temp.id] -= x; if(a[temp.id] < 0) sign = -sign; } Q.push((node){a[temp.id],temp.id}); } for(int i=1;i<=n;i++) { printf("%I64d%c",a[i],i==n?'\n':' '); }}
E.Road to Home
转载于:https://www.cnblogs.com/dgutfly/p/5925915.html