2017ACM/ICPC亚洲区沈阳站-重现赛
HDU 6222 Heron and His Triangle
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6222
思路: 打表找规律+大数运算
首先我们可以打个表暴力跑出前几个满足题意的T
打表代码:
- #include<bits/stdc++.h>
- using namespace std;
- bool fun(double n) {
- if(abs(round(n) - n) < 0.000000000000001)
- return ;
- return ;
- }
- int main()
- {
- for(int i = ;i <= ;i ++){
- double num = (i+)*sqrt(*(i-)*(i+))/;
- if(fun(num))
- cout<<i+<<endl;
- }
- }
打出表后会得到: 4,14,52,194,724等数据。。。经过推导我们会得到他们之间的公式: a[i] = a[i-1]*4-a[i-2],然后我们用大数模板去跑这串公式就好了
实现代码:
- #include<bits/stdc++.h>
- using namespace std;
- /*bool fun(double n) {
- if(abs(round(n) - n) < 0.000000000000001)
- return 1;
- return 0;
- }
- int main()
- {
- for(int i = 2;i <= 10000000;i ++){
- double num = (i+1)*sqrt(3*(i-1)*(i+3))/4;
- if(fun(num))
- cout<<i+1<<endl;
- }
- }*/
- string Mult(string s,int x) //大数乘以整形数
- {
- reverse(s.begin(),s.end());
- int cmp=;
- for(int i=;i<s.size();i++)
- {
- cmp=(s[i]-'')*x+cmp;
- s[i]=(cmp%+'');
- cmp/=;
- }
- while(cmp)
- {
- s+=(cmp%+'');
- cmp/=;
- }
- reverse(s.begin(),s.end());
- return s;
- }
- string sub(string a,string b)
- {
- string c;
- bool ok=;
- int len1=a.length();
- int len2=b.length();
- int len=max(len1,len2);
- for(int i=len1;i<len;i++)
- a=""+a;
- for(int i=len2;i<len;i++)
- b=""+b;
- if(a<b)
- {
- string temp=a;
- a=b;
- b=temp;
- ok=;
- }
- for(int i=len-;i>=;i--)
- {
- if(a[i]<b[i])
- {
- a[i-]-=;
- a[i]+=;
- }
- char temp=a[i]-b[i]+'';
- c=temp+c;
- }
- int pos=;
- while(c[pos]=='' && pos<len) pos++;
- if(pos==len) return "";
- if(ok) return "-"+c.substr(pos);
- return c.substr(pos);
- }
- string s1[];
- int main()
- {
- int t;
- cin>>t;
- string s;
- s1[] = "";s1[] = "";
- for(int i = ;i <= ;i ++)
- s1[i] = sub(Mult(s1[i-],),s1[i-]);
- while(t--){
- cin>>s;
- for(int i = ;i <= ;i ++)
- if(s1[i].size() > s.size()||(s1[i].size()==s.size()&&s1[i]>=s)){
- cout<<s1[i]<<endl;
- break;
- }
- }
- return ;
- }
HDU 6223 Infinite Fraction Path
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6223
思路:bfs + 剪枝
算比较容易的bfs,一直没怎么写bfs,差点写自闭了。。。。调了半天才过。
实现代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int M = 4e5+;
- #define ll long long
- int vis[M]; //判断当前点是否被访问过了
- int n,a[M],top;
- int cnt[M]; //储存当前层被标记点的下标
- int mx[M]; //每一层的最大值
- struct node{
- long long id;
- int val,step;
- };
- //优先排步数小的,步数相等优先值大的
- bool operator < (node a,node b){
- if(a.step == b.step) return a.val < b.val;
- return a.step > b.step;
- }
- priority_queue<node> q;
- void bfs(){
- int last = -;
- while(!q.empty()){
- node now = q.top();
- q.pop();
- if(now.step != last) { //已经步入下一层了清空上一层的标记
- last = now.step;
- while(top) vis[cnt[--top]] = ;
- }
- //限制条件剪枝
- if(now.step == n) continue;
- if(vis[now.id]) continue; //当前点被访问过了,跳过
- if(mx[now.step] > now.val) continue; //当前点小于这一层的最大值,跳过
- //维护标记
- cnt[top++] = now.id;
- vis[now.id] = ; mx[now.step] = now.val;
- //将下一个点扔进队列中
- node next;
- next.id = (now.id*now.id+)%n;;
- next.val = a[next.id];
- next.step = now.step+;
- q.push(next);
- }
- for(int i = ;i < n;i ++) printf("%d",mx[i]);
- for(int i = ;i <= n;i ++) mx[i] = ;
- printf("\n");
- }
- char s[M];
- int main()
- {
- int maxx,t;
- scanf("%d",&t);
- int t1 = t;
- while(t--){
- top = ;
- scanf("%d",&n);
- maxx = ;
- scanf("%s",s);
- for(int i = ;i < n;i ++){
- a[i] = s[i]-'';
- maxx = max(maxx,a[i]);
- }
- mx[] = maxx;
- for(int i = ;i < n;i ++)
- if(a[i] == maxx){
- node now; now.id = i;now.val = a[i],now.step = ;
- q.push(now);
- }
- printf("Case #%d: ",t1-t);
- bfs();
- }
- return ;
- }
HDU 6225 Little Boxes
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6225
大数加法
签到题
实现代码:
- #include<bits/stdc++.h>
- using namespace std;
- string sum(string s1,string s2)
- {
- if(s1.length()<s2.length())
- {
- string temp=s1;
- s1=s2;
- s2=temp;
- }
- int i,j;
- for(i=s1.length()-,j=s2.length()-;i>=;i--,j--)
- {
- s1[i]=char(s1[i]+(j>=?s2[j]-'':));
- if(s1[i]-''>=)
- {
- s1[i]=char((s1[i]-'')%+'');
- if(i) s1[i-]++;
- else s1=''+s1;
- }
- }
- return s1;
- }
- int main()
- {
- int n;
- string x;
- cin>>n;
- for(int i = ;i <= n;i ++){
- string ans = "";
- for(int j = ;j <= ;j ++){
- cin>>x;
- ans = sum(ans,x);
- }
- cout<<ans<<endl;
- }
- return ;
- }
HDU 6227 Rabbits
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6227
思路: 求兔子最多跳的次数,排个序,两种情况取最大的:
第一种: 第二小的和最大的之间距离之差减去中间已经有位置的值
第二种: 倒着跳,第二大的和最小的距离之差减去中间已经有位置的值
签到题
实现代码:
- #include<bits/stdc++.h>
- using namespace std;
- int a[];
- int main()
- {
- int t,n,x;
- scanf("%d",&t);
- while(t--){
- scanf("%d",&n);
- for(int i = ;i <= n;i ++)
- scanf("%d",&a[i]);
- sort(a+,a++n);
- int ans = max(a[n]-a[]-n+,a[n-]-a[]-n+);
- printf("%d\n",ans);
- }
- return ;
- }
HDU 6228 Tree
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6228
思路:
要求公共子集最大,我们肯定是优先选择距离大的两点染成相同的颜色(因为要留位置给其他颜色),要达到公共边最多,那么我们可以先对边进行分析,如果一条边左边结点的子树大于k,右边结点的子树也大于k那么这条边可以成为公共子集的一条因为我们是要求最大的,根据最优策略,肯定要将他加进最大公共子集中,找到这种边+1就好了。
实现代码;
- #include<bits/stdc++.h>
- using namespace std;
- const int M = 1e5 + ;
- vector<int>g[M];
- int ans,n,k,siz[M];
- void dfs(int u,int fa){
- siz[u] = ;
- for(int i = ;i < g[u].size();i ++){
- int v = g[u][i];
- if(v == fa) continue;
- dfs(v,u);
- siz[u] += siz[v];
- if(siz[v] >= k&&(n-siz[v])>=k) ans++;
- }
- }
- int main()
- {
- int t,x,y;
- scanf("%d",&t);
- while(t--){
- memset(siz,,sizeof(siz));
- scanf("%d%d",&n,&k);
- for(int i = ;i <= n;i ++)
- g[i].clear();
- for(int i = ;i < n;i ++){
- scanf("%d%d",&x,&y);
- g[x].push_back(y);
- g[y].push_back(x);
- }
- ans = ;
- dfs(,-);
- printf("%d\n",ans);
- }
- }
2017ACM/ICPC亚洲区沈阳站-重现赛的更多相关文章
- HDU 6227.Rabbits-规律 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))
Rabbits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- HDU 6225.Little Boxes-大数加法 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))
整理代码... Little Boxes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/O ...
- 2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
Little Boxes Problem Description Little boxes on the hillside.Little boxes made of ticky-tacky.Littl ...
- 2016ACM/ICPC亚洲区沈阳站-重现赛赛题
今天做的沈阳站重现赛,自己还是太水,只做出两道签到题,另外两道看懂题意了,但是也没能做出来. 1. Thickest Burger Time Limit: 2000/1000 MS (Java/Oth ...
- 2016ACM/ICPC亚洲区沈阳站-重现赛
C.Recursive sequence 求ans(x),ans(1)=a,ans(2)=b,ans(n)=ans(n-2)*2+ans(n-1)+n^4 如果直接就去解...很难,毕竟不是那种可以直 ...
- hdu 5510 Bazinga (kmp+dfs剪枝) 2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
废话: 这道题很是花了我一番功夫.首先,我不会kmp算法,还专门学了一下这个算法.其次,即使会用kmp,但是如果暴力枚举的话,还是毫无疑问会爆掉.因此在dfs的基础上加上两次剪枝解决了这道题. 题意: ...
- 2015ACM/ICPC亚洲区沈阳站重现赛-HDU5512-Pagodas-gcd
n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, l ...
- 2015ACM/ICPC亚洲区沈阳站-重现赛 M - Meeting (特殊建边,最短路)
题意:有\(n\)个点,\(m\)个集合,集合\(E_i\)中的点都与集合中的其它点有一条边权为\(t_i\)的边,现在问第\(1\)个点和第\(n\)个点到某个点的路径最短,输出最短路径和目标点,如 ...
- 2015ACM/ICPC亚洲区沈阳站-重现赛 B - Bazinga (KMP)
题意:给你\(n\)个字符串,\(s_1,s_2,...,s_n\),对于\(i(1\le i\le n)\),找到最大的\(i\),并且满足\(s_j(1\le j<i)\)不是\(s_i\) ...
随机推荐
- 常见camera测试卡
常见camera测试卡 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/luckywang1103/article/details/87166 ...
- 01-Mirrorgate简介
1.项目信息 MirrorGate是一款WallBoard应用程序,旨在为团队提供与软件开发相关的所有不同领域的快速反馈. 项目地址:https://github.com/BBVA/mir ...
- RocketMQ环境搭建
1 源码下载 wget http://mirror.bit.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip unzip ...
- NOI.ac #8 小w、小j和小z LIS
传送门 题意:在一个数轴上,给出$N$个人的初始位置与速度(速度有方向),求最大的时间使得存在$N-K$个人在这一段时间内两两没有相遇.$1 \leq K \leq N \leq 10^5$ 显然有二 ...
- vue 中使用iconfont Unicode编码线上字体图标的流程
1.打开http://www.iconfont.cn官网,搜索你想要的图标.添加字体图标到购物车,点击购物车然后添加至项目,点击确定 2.点击图标管理/我的项目,找到对应的文件,点击Unicode,然 ...
- core_cm4_simd.h文件是干嘛的?
core_cm4_simd.h文件用于simd指令,即单指令多数据流,这个只有ARMv7架构才有,Cortex m3 m4 m7是ARMv7架构,而Cortex m0 m1是没有的. 所以,在新建Co ...
- KMeans算法分析以及实现
KMeans KMeans是一种无监督学习聚类方法, 目的是发现数据中数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好. 无监督学习,也就是没有对应的标签,只有数据 ...
- Python高阶函数--map
map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把list 的每个元素依次作用在函数 f 上,得到一个新的 list 并返回. 例如,对于lis ...
- Http指南(1)
网关:是一种特殊的服务器,作为其他服务器的中间实体使用; Agent代理:所有发布web请求的应用程序都是HTTP Agent代理.Web浏览器其实就是一种代理; HTTP报文是在HTTP应用程序之间 ...
- tomcat内存溢出问题记录
问题说明:公司内网环境中部署的jenkins代码发版平台突然不能访问了,查看tomcat的catalina.out日志发现报错如下: [root@redmine logs]# tail -f /srv ...