ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

世界上最帅的人——左帅写的补题报告

世界上最帅的人——左帅写的补题报告 第一题100分​​我用了45min,题意如下题意就是有n个人每个人都有123星英雄3个1星2星三个2星三星然后每个人的实力为18*三星个数 3*2星个数 1星个数但是如果我们用for里面加while将会时间超现于是正确代码如下#includeiostream #includecstdio #includealgorithm using namespace std; long long n; struct node{ long long yi,er,san,ans,id; }a[100005]; bool cmp(node x,node y){ if(x.ansy.ans){ return x.idy.id; } return x.ansy.ans; } int main(){ freopen(chess.in,r,stdin); freopen(chess.out,w,stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cinn; for(int i1;in;i){ cina[i].sana[i].era[i].yi; a[i].idi; //A1 a[i].era[i].era[i].san/3; //A2 a[i].sana[i].san%3; //A3 a[i].yia[i].yia[i].er/3; a[i].era[i].er%3; a[i].ans18*a[i].yi3*a[i].era[i].san; } sort(a1,a1n,cmp); for(int i1;in;i){ couta[i].id ; } return 0; }A1:他让输出排序后的编号于是排序后就可以输出idA2与A3不能调换就因为这个问题我卡了10min如果调换那这会先%3后面再/3是不行的套路分析模拟题注意细节第二题100分我用了45min,题意是有n*n的矩阵上面有正数也有负数你有初始值100从11走你可以按照原方向走也可以顺时针转90°只能1次请问回到起点后值最高时多少我的思路我们不难发现最终总是以一个矩阵的形式出现以这个为例如果你在11往下走发现走到底部是无法左转所以一定向右走所以大概就是如果不是矩阵的话就会进入死胡同然后我们思考这不就是枚举每个矩阵然后计算周长的max不就行了问题是如何计算周长我们可以用二位前缀和例如这个矩阵的前缀和我们想删除中间的四个数应该减去sum[ i-1 ][ j-1 ],就是这样红色是加上的:从变成了我们应该加上不就是sum[ i-1 ][ 1 ]和sum[ 1 ][ j-1 ],再减去sum[ 1 ][ 1 ]于是恭喜你写出了正解代码#includeiostream #includecstdio #includealgorithm using namespace std; int n,a[1005][1005]; long long sum[1005][1005],maxx-1e16; int main(){ freopen(BigWater.in,r,stdin); freopen(BigWater.out,w,stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cinn; for(int i1;in;i){ for(int j1;jn;j){ cina[i][j]; } } for(int i1;in;i){ for(int j1;jn;j){ sum[i][j]sum[i-1][j]sum[i][j-1]-sum[i-1][j-1]a[i][j]; } } for(int i1;in;i){ for(int j1;jn;j){ if(i1||j1){ //B1 continue; } maxxmax(maxx,sum[i][j]-sum[i-1][j-1]sum[i-1][1]sum[1][j-1]sum[1][1]); } } coutmaxx100; return 0 }针对B1如果这个矩形是这样或者这样是不行的因为你转不过来。于是我该写第三题了。第三题5分我用了不少时间但得分......其实我的思路与正确思路差不多但是吧我想的特殊情况太多了其实只用一行代码就行。题意有x个精灵编号为1~x有y个怪物每个怪物的初始实力为ai编号为x1~(xy),再给你m个绳子连接u和v如果有精灵被连接住了那就把绳子剪短而剪下来的绳子会变成强度为b的可以困住怪物的绳子每个自由的怪物都需要被困住但只有强度怪物初始实力的绳子才能困住怪物你可以花1魔力使绳子强度1最少花多少魔力两个角色之间可能有多条绳子原题如下这个题就要把所有连接精灵的绳子剪短但有可能会放出怪物所以要把剪断的绳子和自由的怪物存起来在考场上我用了一个十分复杂的方式但其实不用于是正确代码如下#includeiostream #includecstdio #includealgorithm using namespace std; int guai[200005],sheng[200005],x,y,m,u,v,b,a[200005],cnts,cntg;//C1 long long ans; bool vis[200005]; int main(){ //freopen(gremlin.in,r,stdin); //freopen(gremlin.out,w,stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cinxym; for(int i1;iy;i){ cina[i]; } for(int i1;im;i){ cinuvb; if(uxvx){ //C2 vis[u]1,vis[v]1; } else{ //C3 sheng[cnts]b; } } for(int ix1;ixy;i){ if(vis[i]0){ guai[cntg]a[i-x]; //C4 } } if(cntgcnts){ //C5 cout-1; return 0; } sort(guai1,guai1cntg,greaterint()); //C6 sort(sheng1,sheng1cnts,greaterint()); for(int i1;icntg;i){ if(sheng[i]guai[i]){ ansansguai[i]-sheng[i]; } } coutans; return 0; }C1:guai[200005]:存自由的怪兽的cntg 记录个数。sheng[200005]存剪短后的绳子cnts 记录个数C2:当u和v均为怪兽时记录标记是为被拴住的怪兽C3:否则就说明这个绳子要被剪断所以个数。即使现在有自由的怪兽也不能guai[ cntg ]---,如果在后面这个怪兽还有其他连边那就不能记录所以要在C4统一进行统计C4当没有访问过时一定是自由的怪兽这是再。C5当绳子的数量自由怪兽的数量即使每个绳子都用来绑怪兽仍然有自由的怪兽所以输出-1C6sort里面有greaterint()说明这是从大到小的排序方式综上我要写第四题了第四题50分我这个题用了30min用了5层for循环成功50分题意如下给你6个数第一个数代表美味程度为1的糖果的个数第二个数代表美味程度为2的糖果的个数......请问能否平分这六个数的和输出方式看原题这个题就是一个多重背包的二进制优化。把每个糖果当成一个物品正确代码如下#includeiostream #includecstdio #includealgorithm using namespace std; int a[20],k,ans,p,x,dp[200005]; int main() { //freopen(candy.in,r,stdin); //freopen(candy.out,w,stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); while(1){ k; cina[1]a[2]a[3]a[4]a[5]a[6]; ansa[1]2*a[2]3*a[3]4*a[4]5*a[5]6*a[6]; if(ans0){ break; } for(int i1;ians;i){ dp[i]0; } dp[0]1; for(int i1;i6;i){ for(int k1;ka[i];kk*2){ //D1 for(int jans;ji*k;j--){ dp[j]dp[j]|dp[j-i*k]; } a[i]a[i]-k; } if(a[i]!0){ for(int jans;ji*a[i];j--){ //D2 dp[j]dp[j]|dp[j-i*a[i]]; } } } coutCollection #k:\n; if(ans%20dp[ans/2]1){ coutCan be divided.\n\n; } else{ coutCant be divided.\n\n; } } return 0; }D1:dp[i]代表能否凑出idp[ j ]就是可以在dp[ j-i*k ]加上i*k得到D2:如果在a[ i ]中仍有剩余就要再进行dp这里就是dp[j-i*a[i]]写完了
返回列表