G-机器人:排序+高精度
https://ac.nowcoder.com/acm/contest/9986/G
思路:
k1排k2前面满足
k1.a*(k2.ax+k2.b)+k1.b<k2.a(k1.ax+k1.b)+k2.b
k2.ak1.b+k2.b>k1.a*k2.a+k1.b
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const int N = 500005;
const ll ds = 1e15+7;
//const double p1 = 3.141592653589793238462643383;
using namespace std;
struct Node{
int a,b;
}node[25];
//k1排k2前面满足
//k1.a*(k2.a*x+k2.b)+k1.b<k2.a*(k1.a*x+k1.b)+k2.b
//k2.a*k1.b+k2.b>k1.a*k2.a+k1.b
bool cmp(Node k1,Node k2)
{
return k2.a*k1.b+k2.b>k1.a*k2.b+k1.b;
}
void print(__int128 x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) print(x / 10);
putchar(x % 10 + '0');
}
void solve()
{
int n,x;
cin >> n >> x;
for(int i = 1; i <= n; i++){
cin >> node[i].a >> node[i].b;
}
sort(node+1,node+n+1,cmp);
__int128 ans = node[1].a*x+node[1].b;
for(int i = 2; i <= n; i++){
ans = node[i].a*ans+node[i].b;
}
print(ans);
}
int main()
{
solve();
return 0;
}
J-天空之城:最小生成树模板
https://ac.nowcoder.com/acm/contest/9986/J
思路:仔细一看发现是最小生成树,现在麻烦的是如何建图,因为每个点是字母,那就将字母用数字代替。
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const int N = 500005;
const ll ds = 1e15+7;
//const double p1 = 3.141592653589793238462643383;
using namespace std;
struct Node{
int u,v;
ll val;
bool operator<(const Node& a)const{
return val < a.val;
}
}node[N];
map<string,int>mp;
int f[N];
int k,n,q,flag = 0,num = 1;
ll ans = 0;
int find(int x)
{
if(x!=f[x]) return f[x] = find(f[x]);
return f[x];
}
void merge(int x,int y)
{
x = find(x);
y = find(y);
if(x!=y) f[x] = f[y];
}
void solve()
{
string s1,s2,tmp;
while(cin >> n >> q){
ans = 0;
for(int i = 1; i <= n; i++)
f[i] = i;
cin >> tmp;
mp[tmp] = 1;
int cnt = 1;
for(int i = 1; i <= q; i++){
ll v;
cin >> s1 >> s2 >> v;
if(!mp[s1]) mp[s1] = ++cnt;
if(!mp[s2]) mp[s2] = ++cnt;
node[i].u = mp[s1];
node[i].v = mp[s2];
node[i].val = v;
}
sort(node+1,node+q+1);
int cnt1 = 0;
for(int i = 1; i <= q; i++){
if(cnt1 == n-1) break;
int u = node[i].u;
int v = node[i].v;
if(find(u) != find(v)) {
merge(u,v);
ans += node[i].val;
cnt1++;
}
}
if(cnt1 != n-1) cout << "No!" << endl;
else cout << ans << endl;
mp.clear();
}
}
int main()
{
solve();
return 0;
}