这场比赛依旧是三道题,E其实比我们出的D难一点,但确实在能力范围之内,出了就保底铜牌了,出的快的话说不定有银。策略很重要

E. Resistors in Parallel

大数+打表找规律。
最后得出公式:R=素数乘积/该素数的因子之和
由于范围达到了10的100次幂,有一次感受到python的便捷,但用的太少,不如c++顺手。
1.素数筛得出素数。2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47……
2.重点在于素数因子之和的处理。(分子各个质因子+1)的乘积。

# -*- coding: utf-8 -*-
prime=[]
def is_prime(n):i=2vis=[0 for i in range(n+5)]while i*i<=n:if vis[i]==0:for j in range(i*2,n,i):vis[j]=1i+=1for i in range(n+5):if i==0 or i==1 : continueif vis[i]==0:prime.append(i)
def gcd(a,b):return a if b==0 else gcd(b,a%b)is_prime(100000)
for T in range(int(input())):n=int(input())sum1=1sum2=1i=0while 1:if sum1*prime[i]>n:breaksum1*=prime[i]sum2*=(prime[i]+1)i+=1g=gcd(sum1,sum2)#print(sum1,sum2,sum2)sum1//=gsum2//=gprint(f"{sum1}/{sum2}")

E2. Divisible Numbers (hard version)

思路:
k1和k2是a、b乘积数的因子,因此得出公式:x*y=k*a*b=kk*k1*k2
分解a和b的质因子,再去深搜k1、k2对于各个质因子的所取个数
最后比较x和y的值小于等于c和d,即为找到满足要求的数。

#include <bits/stdc++.h>
#define int long long
#define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
#define endl '\n'
#define ULL unsigned long long
#define down 0.996
using namespace std;
const double eps=1e-8;
const double inf=1e18;
const int mod=998244353;
const int P=131;
const int N=7e5+5;
int a,b,c,d,ansx,ansy,flag;
map<int,int>mp;
vector<pair<int,int>>e;
int qpow(int x,int y)
{int res=1;while(y){if(y&1) res*=x;x*=x;y>>=1;}return res;
}
void demcopse(int x)
{for(int i=2;i*i<=x;i++)if(x%i==0)while(x%i==0) mp[i]++,x/=i;if(x>1) mp[x]++;
}
void dfs(int num,int k1,int k2)
{if(flag) return;if(num==e.size()){int sx=(a/k1+1)*k1;int sy=(b/k2+1)*k2;if(sx<=c&&sy<=d)flag=1,ansx=sx,ansy=sy;return;}int x=e[num].first,y=e[num].second,pw=0,tmp=1;pw=qpow(x,y);for(int i=0;i<=y;i++){dfs(num+1,k1*tmp,k2*(pw/tmp));tmp*=x;}
}
void solve()
{mp.clear();e.clear();ansx=ansy=flag=0;cin>>a>>b>>c>>d;demcopse(a);demcopse(b);for(auto x:mp) e.push_back(x);dfs(0,1,1);if(flag)cout<<ansx<<" "<<ansy<<endl;elsecout<<"-1 -1"<<endl;
}
signed main()
{ios;int T;cin>>T;while(T--)solve();return 0;
}

D. Paths on the Tree

题意:找到k条简单路径,每个点都有一个权值p[i]c[i]为经过该点的次数,在满足一个分支节点的孩子|c[i]-c[j]|<=1的情况下,要求各个点 的c[i]*p[i]权值最大。
思路:
1.在满足题目限制条件的情况下,可看出对于一个结点的孩子来说,会有p(k%sz)个结点被多经过一次,因此我们需要找到权值较大的节点路径进行分配。
2.设计dp状态:f[u][0]表示以u为根节点,没有被分配额外一次路径所获得的最大权值;
f[u][1]表示以u为根节点,被分配额外一次路径所获得的最大权值.
3.对每一层的孩子节点可进行降序排列存到vector数组中。

#include <bits/stdc++.h>
#define int long long
#define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
#define endl '\n'
#define ULL unsigned long long
#define down 0.996
using namespace std;
const double eps=1e-8;
const double inf=1e18;
const int mod=998244353;
const int P=131;
const int N=2e6+5;
int n,k,p[N],dp[N][2];
vector<int>e[N];
void dfs(int u,int k)
{dp[u][0]=p[u]*k;dp[u][1]=(k+1)*p[u];vector<int>son;for(int v:e[u]) son.push_back(v);if(!son.size()) return;int x=son.size();int k1=k/x,k2=k%x;vector<pair<int,int>>tp;for(int v:son) dfs(v,k1);for(int v:son) tp.push_back({dp[v][1]-dp[v][0],v});sort(tp.begin(),tp.end(),[&](pair<int,int> &p,pair<int,int> &q){return p.first>q.first;});for(int i=0;i<tp.size();i++){int v=tp[i].second;if(i<k2) dp[u][0]+=dp[v][1];else dp[u][0]+=dp[v][0];if(i<=k2) dp[u][1]+=dp[v][1];else dp[u][1]+=dp[v][0];}
}
void solve()
{cin>>n>>k;for(int i=0;i<=n;i++) e[i].clear();for(int i=2;i<=n;i++){int x;cin>>x;e[x].push_back(i);}for(int i=1;i<=n;i++) cin>>p[i];dfs(1,k);cout<<dp[1][0]<<endl;
}
signed main()
{ios;int T;cin>>T;while(T--)solve();return 0;
}

D. Problem with Random Tests

略有取巧的做法,使用了bitset进行位运算,猜测前50位必会随机产生一个0

#include <bits/stdc++.h>
#define int long long
#define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
#define endl '\n'
#define ULL unsigned long long
#define down 0.996
using namespace std;
const double eps=1e-8;
const double inf=1e18;
const int mod=998244353;
const int P=131;
const int N=1e6+5;
int n;
string s;void solve()
{cin>>n>>s;int g=0;while(g<n&&s[g]!='1') g++;if(g>=n){cout<<0<<endl;return;}s=s.substr(g,n);bitset<N>b1(s),b2(s);string ans=b1.to_string();for(int i=1;i<=50;i++)ans=max(ans,(b1|(b2>>i)).to_string());g=0;while(g<ans.length()&&ans[g]!='1') g++;cout<<ans.substr(g)<<endl;
}
signed main()
{ios;//int T;cin>>T;//while(T--)solve();return 0;
}

F. Honeycomb

思路:这题输出的时候好像不能用ios,不然会wa 1.
1.使用bfs从起点搜索到终点,到达终点后判断退出,输出最小值。
2.对于走过的点可使用特殊字符进行标记,这样就不会走回头路了。找对6个方向记录到数组中即可。

#include <bits/stdc++.h>
#define int long long
#define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
#define endl '\n'
#define ULL unsigned long long
#define down 0.996
using namespace std;
const double eps=1e-8;
const double inf=1e18;
const int mod=998244353;
const int P=131;
const int N=1e6+5;
int r,c,sx,sy,tx,ty,row,col;
char mp[4005][6005];
int len[4005];
int dx[6]={-2,2,-2,2,-4,4};
int dy[6]={-6,-6,6,6,0,0};
queue<pair<pair<int,int>,int>>q;
bool check(int x,int xx,int y,int yy)
{int kx=(x+xx)/2,ky=(y+yy)/2;if(xx>=1&&xx<=row&&yy>=1&&yy<=len[xx]&&mp[xx][yy]!='@'&&mp[kx][ky]!='-'&&mp[kx][ky]!='/'&&mp[kx][ky]!='\\')return 1;return 0;
}
void solve()
{while(!q.empty()) q.pop();cin>>r>>c;row=r*4+3,col=c*6+3;for(int i=1;i<=row;i++){len[i]=0;for(int j=0;j<=col;j++) mp[i][j]=' ';}getchar();for(int i=1;i<=row;i++){gets(mp[i]+1);len[i]=strlen(mp[i]+1);for(int j=1;j<=len[i];j++)if(mp[i][j]=='S') sx=i,sy=j;else if(mp[i][j]=='T') tx=i,ty=j;}
//    for(int i=1;i<=row;i++)
//    {//        for(int j=1;j<=len[i];j++)
//            cout<<mp[i][j];
//        cout<<endl;
//    }int ans=-1;q.push({{sx,sy},1});while(!q.empty()){auto cur=q.front();auto ccur=cur.first;int x=ccur.first,y=ccur.second,step=cur.second;// cout<<x<<" "<<y<<endl;if(x==tx&&y==ty){ans=step;break;}q.pop();for(int i=0;i<6;i++){int xx=x+dx[i],yy=y+dy[i];if(check(x,xx,y,yy)){mp[xx][yy]='@';q.push({{xx,yy},step+1});}}}cout<<ans<<endl;
}
signed main()
{//ios;int T;cin>>T;while(T--)solve();return 0;
}

ICPC焦作站(E、F)+思维+树上dp相关推荐

  1. JSK-107305丨ICPC焦作站网赛 B丨dp

    题意: 给出n个数字,顺次取出m个数,按照给出的m个运算符,依次去运算于k.保证m个运算符都用掉,求算计算结果的最大值. 思路: 观察到m很小只有5,5x1000的复杂度是够用的,所以可以找找状态转移 ...

  2. 2018 ICPC焦作站 F题 Honeycomb【bfs】

    题目链接:https://codeforces.com/gym/102028/problem/F 这题就是输入处理比较恶心,先写个gets(mp[x]+1) 本地没问题,oj的编译器直接报错,真玄学, ...

  3. 2018 icpc 焦作站 自闭记

    今年三站,秦皇岛,徐州,焦作.全部打铜,心情不是一般的失落. 可能我真的只有铜牌的水平吧. 我们5题 14个小时罚时,离银牌线还差5个小时罚时. 如果我码力再强一点,F题不出bug 这里就能少3个小时 ...

  4. Gym 102028D Keiichi Tsuchiya the Drift King(2018 ICPC 焦作站 D 题) 计算几何

    去年暑假集训了两个月就去了焦作,这个题一直卡着到最后也没做出来,很遗憾的在人生中第一场 ICPC 比赛打了铁.当时也没有补题的习惯,这个题知道了大致做法后就放过了.今年准备银川赛区,翻出了往年的比赛真 ...

  5. 2018 icpc 焦作站现场赛 E题题解

    水题没人写题解,都直接上Java代码--那我写一个. 计蒜客题面:https://nanti.jisuanke.com/t/A2203 题意:如果i是完全平方数(>=4)的倍数,那么i号电阻的阻 ...

  6. 2018年11月25日ICPC焦作站参赛总结

    可能就这么退役了吧. 对这次ICPC还是比较有信心的,毕竟心态都放平和了. 路途很波折,热身赛还是赶上了. 等到了正赛的时候,开场看出了A题的签到,签到肯定是我来签的,11分钟签完了这道题之后,开始看 ...

  7. Icpc 焦作站现场赛 E 题解

    这道题当时做的时候推不出来,晚上去找题解,不是Java,就是Python,对于只会c/c++的萌新,哎,难受.硬着头皮看了好久,大概懂了思路,第二天自己把前天的又推了一遍发现是自己计算错误的问题,要被 ...

  8. 2020 ICPC 南京站 M Monster Hunter (树形DP)

    题目链接:M-Monster Hunter_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5 ...

  9. 21年icpc沈阳站记录

    icpc沈阳站记录 2021.11.22凌晨 从昨晚紧张到辗转反侧,虽然早就做好了打铁的心理准备,但待到比赛最后一刻两道铜牌题还没出时,满脑子的不甘心.当然最后肯定铁了395/576. 11.21也就 ...

最新文章

  1. 黄聪:IE6下css大bug:文字神秘消失,鼠标选择了才出现
  2. Python编程系列教程第16讲——拷贝自身到系统目录
  3. JSON.stringify()和JSON.parse()分别是什么
  4. mysql istransient_由于 MySQL 版本问题导入报错
  5. 数据如何导入oracle数据库,如何用Oracle导入导出工具来实现Oracle数据库移植?
  6. C#线程通信与异步委托
  7. spring EL 实现ref的效果
  8. 10 张程序员喜爱的壁纸,需要自取~
  9. RWMutex的一道面试题
  10. 全球TOP100电子杂志整理
  11. JAVA类似ABP框架_【Net】ABP框架学习之它并不那么好用
  12. 信道滤波带宽,信号带宽,频率误差的关系
  13. 算法仿真----分治法找假币
  14. P3369 【模板】普通平衡树
  15. 谢耳朵最萌最贱表情, 哈哈
  16. 亚马逊云科技又一全球人才培养项目在中国的落地
  17. 命令行导入mysql数据库
  18. 【古墓射手】隐私政策
  19. VUE H5页面微信/QQ/微博 分享连接设置
  20. 归并排序详解(Acwing 归并排序y总模板)

热门文章

  1. 安卓逆向-new-sec6-4 Java反射相关知识以及平头哥框架hook构造函数 | App发布测试版本感染
  2. 最快最方便的献爱心方式——蚂蚁庄园
  3. iPhone记步和Android计步,手机中运动步数是如何计算的?
  4. Origin画图笔记
  5. photoshop7.0 排版一寸照片、2寸照片
  6. android录音笔记软件,录音笔记app
  7. 给定一个正整数n,输出如下n*n之字形方阵
  8. C++ opencv之像素操作之逻辑操作(bitwise_and,bitwise_xor,bitwise_or,bitwise_not)
  9. [BZOJ3161]孤舟蓑笠翁
  10. 微信公众号图文如何添加PDF附件