文章目录L-A*B题目大意解题思路完整代码J-小苯的星轨题目大意解题思路完整代码D-小圆爱玩龙龙(Easy)题目大意解题思路完整代码总结L-A*BL题题目大意计算A*B(1A,B1018)解题思路这是一道典型的高精度算法题目a,b的范围都比较大所以不能直接两数相乘可以让数字以字符串读入模拟手工竖式乘法先用字符串读取数字a,b,存一下两个字符串的长度再用两个数组把字符串的每一个数字存进去string s1,s2; cins1s2; vectorll a; vectorll b; ll l1s1.size(); ll l2s2.size(); for(char c:s1) { a.push_back(c-0); } for(char c:s2) { b.push_back(c-0); }再反转数组把低位放在数组下标是0的位置上模拟竖式乘法模拟竖式乘法a的第i位 * b的第j位结果加到c[ij]位置reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); // 两个数字相乘结果最多 l1l2 位全部初始化为0 vectorllc(l1l2,0); // 模拟竖式乘法a的第i位 × b的第j位结果加到c[ij]位置 for(int i0;il1;i) { for(int j0;jl2;j) { c[ij]a[i]*b[j]; } } ll t0; // 处理进位t用来保存进位 for(ll i0;ic.size();i) { tc[i];// 当前位的值加上之前的进位 c[i]t%10;// 当前位只保留个位 t/10;// 进位给到下一位 } // 删除最高位多余的前导0如果不止一位数末尾数组最后的0要pop掉 if(c.size()1c.back()0) { c.pop_back(); }完整代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second using namespace std; const ll N1e610; int main() { IOS string s1,s2; cins1s2; vectorll a; vectorll b; ll l1s1.size(); ll l2s2.size(); for(char c:s1) { a.push_back(c-0); } for(char c:s2) { b.push_back(c-0); } reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); vectorllc(l1l2,0); for(int i0;il1;i) { for(int j0;jl2;j) { c[ij]a[i]*b[j]; } } ll t0; for(ll i0;ic.size();i) { tc[i]; c[i]t%10; t/10; }if(c.size()1c.back()0) { c.pop_back(); } for(ll ic.size()-1;i0;i--) { coutc[i]; } // coutfixedsetprecision(x) ; return 0; }J-小苯的星轨J题题目大意现有n个星星在直角坐标系上第i颗星星的坐标是(xi,yi),可以是(0,0),两颗星星的直线经过原点则合法求样例中有多少个合法星星对解题思路先用一个mapkeypairll,ll,表示标准化之后的方向向量valuell,记录这个方向上一共有多少个星星先考虑星星就在原点单独计数求x,y绝对值的最大公约数约分到最简形式代表同一方向ll n,z0,ans0; cinn; mappairll,ll,ll mp; for(ll i0;in;i) { ll x,y; cinxy; if(!x!y){ z; continue; } ll g__gcd(llabs(x),llabs(y)); x/g; y/g; if(y0||(!yx0)){//方向对统一让y0如果y等于0则让x0 x-x; y-y; } mp[{x,y}]; } for(auto it : mp) { ll cit.second; ans c*(c-1)/2;// 遍历map对于同一个方向上有c个点从中选2个点的组合数 c*(c‑1)/2 } // 这些点两两配对连线必然经过原点属于合法星星对 ans z*(n-z); coutans\n; }完整代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second using namespace std; const ll N1e610; ll a[N]; void solve(){ ll n,z0,ans0; cinn; mappairll,ll,ll mp; for(ll i0;in;i) { ll x,y; cinxy; if(!x!y){ z; continue; } ll g__gcd(llabs(x),llabs(y)); x/g; y/g; if(y0||(!yx0)){ x-x; y-y; } mp[{x,y}]; } for(auto it : mp) { ll cit.second; ans c*(c-1)/2; } ans z*(n-z); coutans\n; } int main() { IOS int T; cinT; while(T--) { solve(); } // coutfixedsetprecision(x) ; return 0; }D-小圆爱玩龙龙(Easy)D题题目大意给你一堆道具每个道具买它要花一笔钱拿到手能获得对应的快乐值你手里总共有 W 块钱你可以最多挑其中一件道具直接免费拿不用花钱剩下要买的道具总花费不能超过你手里的钱求你最后能拿到的最大快乐值解题思路先遍历一个f代表第f件物品免费拿走f全部遍历完就是枚举了所有某一件是免费的所有情况剩余的物品就做一个01背包总花费不能超过预算W算出最大价值dp[w],最后总快乐就是dp[w]v[f]for(int f0;fN;f) {// dp[j]花费j元能拿到的最大快乐值不包含免费物品f vectorll dp(W1,0); for(int i0;iN;i) {// f是免费的所以01背包跳过这件物品不花钱买它 if(if) continue; for(int jW;jw[i];j--) { dp[j]max(dp[j],dp[j-w[i]]v[i]); } }// dp[W]花不超过W的钱买别的物品再加上免费拿到的f的价值v[f] ansmax(ans,dp[W]v[f]);完整代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second using namespace std; const ll N1e610; ll a[N]; int main() { IOS ll N,W; cinNW; vectorll w(N),v(N); for(int i0;iN;i) { cinw[i]v[i]; } ll ans0; for(int f0;fN;f) { vectorll dp(W1,0); for(int i0;iN;i) { if(if) continue; for(int jW;jw[i];j--) { dp[j]max(dp[j],dp[j-w[i]]v[i]); } } ansmax(ans,dp[W]v[f]); } coutansendl; // coutfixedsetprecision(x) ; return 0; }总结这次的联赛涉及的背包题较多然后考到了高精度之前虽然学过但也忘得差不多了还有一些数学思维题包括打表找规律之类的这次补题主要简单了解01背包顺便回忆高精度问题