暑训day1解题报告

A - Painting the sticks
因为不能覆盖涂/涂两次,所以就数数有几个三个一块儿就行了。
#include<cstdio>
int a[100],ans ;
int main()
{int n , t = 0 ;while (scanf("%d",&n)!=EOF) {for (int i=1; i<=n; ++i) scanf("%d",a+i);ans = 0 ; for (int i=1; i<=n ; ++i) if (a[i]!=a[i-1]) ++ans ; ans = ans /3 + ( ans % 3>0)  ; ++t ; printf("Case %d: %d\n",t,ans) ; }
}
View Code

 

B - "Ray, Pass me the dishes!"

线段树,没过,不知道是想错了还是写呲毛了。

#include <iostream>
#include <cstring>
#include <cstdio>using namespace std;/*** 待处理序列A从1到N* min对应的序列是前缀和序列右移一位*/
const int  MaxN = 500000;
#define left  first
#define right second
long long A[MaxN];
struct Range:pair<int,int>{Range(int a=0,int b=0){left  = a;right = b;}long long sum(){return A[right]-A[left-1];}
};
struct node {int l,r,maxPos,minPos;node(int x=0){l=r=maxPos=minPos=x;}long long ans(){return A[l]-A[r-1];}long max(){return A[maxPos];}long min(){return A[minPos-1];}
};
struct SegmentTree
{#define MaxSegmentLength 500000const int root;SegmentTree():root(1){}node data[4*MaxSegmentLength];void newNode(int p,int x){data[p]=node(x);}void maintain(int p){int lch= p*2,rch= p*2+1,t=0;t=(data[lch].ans()>data[rch].ans())?lch:rch;data[p].l=data[t].l;data[p].r=data[t].r;if(data[p].ans()<(data[rch].max()-data[lch].min())){data[p].l=data[lch].minPos;data[p].r=data[rch].maxPos;}data[p].maxPos = (data[lch].max()>data[rch].max())?data[lch].maxPos:data[rch].maxPos;data[p].minPos = (data[lch].min()<data[rch].min())?data[lch].minPos:data[rch].minPos;}void build(int x,int y,int p){if (x==y)newNode(p,x);else {int mid=(x+y)/2;build(x    ,mid,p*2  );build(mid+1,y  ,p*2+1);maintain(p);}}int queryMax(int x,int y,int l,int r,int p){//cout<<"QueryMax  ("<<x<<','<<y<<")  ["<<l<<','<<r<<"] @"<<p<<endl;if (x==l && y==r) return data[p].maxPos;int mid = (l+r)/2,LPos,RPos;//cout<<"        "<<l<<','<<mid<<'|'<<mid+1<<','<<r<<endl;if (y<=mid) return queryMax(x,y,l    ,mid,p*2  );if (x >mid) return queryMax(x,y,mid+1,r  ,p*2+1);LPos=queryMax(x    ,mid,l    ,mid,p*2);RPos=queryMax(mid+1,y  ,mid+1,r  ,p*2+1);//cout<<"     max(L,R)"<<LPos<<' '<<RPos<<endl;return A[LPos]>A[RPos] ? LPos : RPos;}int queryMin(int x,int y,int l,int r,int p){//cout<<"QueryMin  ("<<x<<','<<y<<")  ["<<l<<','<<r<<"] @"<<p<<endl;if (x==l && y==r) return data[p].minPos;int mid = (l+r)/2,LPos,RPos;//cout<<"        "<<l<<','<<mid<<'|'<<mid+1<<','<<r<<endl;if (y<=mid) return queryMin(x,y,l    ,mid,p*2  );if (x >mid) return queryMin(x,y,mid+1,r  ,p*2+1);LPos=queryMin(x    ,mid,l    ,mid,p*2);RPos=queryMin(mid+1,y  ,mid+1,r  ,p*2+1);//cout<<"     min(L,R)"<<LPos<<' '<<RPos<<endl;return A[LPos-1]<A[RPos-1] ? LPos : RPos;}Range query(int x,int y,int l,int r,int p){//cout<<"Query  ("<<x<<','<<y<<")  ["<<l<<','<<r<<"] @"<<p<<endl;if (x==l && y==r) return Range(data[p].l,data[p].r);int mid = (l+r)/2 ;//cout<<"        "<<l<<','<<mid<<'|'<<mid+1<<','<<r<<endl;if (y<=mid) return query(x,y,l    ,mid,p*2  );if (x >mid) return query(x,y,mid+1,r  ,p*2+1);Range LRange,RRange,ans;LRange=query(x    ,mid,l    ,mid,p*2  );RRange=query(mid+1,y  ,mid+1,r  ,p*2+1);ans = LRange.sum()>RRange.sum() ? LRange : RRange;//cout<<"     max(Query)"<<ans.sum()<<endl;int MaxPos=queryMax(mid+1,y  ,mid+1,r  ,p*2+1),MinPos=queryMin(x    ,mid,l    ,mid,p*2  );//cout<<"          MaxPos:"<<MaxPos<<"  "<<"MinPos:"<<MinPos<<endl;if(A[MaxPos]-A[MinPos-1]>ans.sum()){ans.left  = MinPos;ans.right = MaxPos;}//cout<<"      max(max-min)"<<ans.sum()<<endl;return ans;}#undef MaxSegmentLength
};SegmentTree Tree;int main()
{int n,m,CaseNum=0;A[0]=0;while(scanf("%d%d",&n,&m)!=EOF){for(int i=1;i<=n;i++) scanf("%lld",A+i);for(int i=2;i<=n;i++) A[i]+=A[i-1];Tree.build(1,n,Tree.root);printf("Case %d:\n",++CaseNum);for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);Range ans = Tree.query(a,b,1,n,Tree.root);printf("%d %d\n",ans.left,ans.right);}}/*int N,delta;cin>>N;for(int i=1;i<=N;i++) cin>>A[i];//delta=A[1];//A[1]=A[0]=0;for(int i=2;i<=N;i++)A[i]+=A[i-1];//-delta;//for(int i=1;i<=N;i++)cout<<A[i]<<' ';//cout<<endl;Tree.build(1,N,Tree.root);int a,b;while(cin>>a>>b){Range ans = Tree.query(a,b,1,N,Tree.root);cout<<ans.left<<' '<<ans.right<<endl;//cout<<ans.left<<','<<ans.right<<endl<<endl;}*/return 0;
}
//10
// 1  2  3  4  5  6  7  8  9  10
// 4  5  6  2  9  0 -1 13  9 -10
// 4  9 15 17 26 26 25 38 47  37
// 0  1  2 -2  5 -4 -5  9  5 -14
View Code

 

C - Plucking fruits

最小瓶颈树,跟kruskal类似

#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn= 1010 ,maxm = maxn*maxn;struct edge{int u,v,w;};
struct query{int u,v,d,ord;};
int f[maxn],n,m,r;
query q[maxm];
edge e[maxm];
int ord[maxm];
bool ans[maxm];bool compe(edge  a,edge  b){return a.w>b.w ;}
bool compq(query a,query b){return a.d>b.d ;}int Find(int x){ return f[x]==x ? x : f[x]=Find(f[x]);}
int Union(int x,int y){int fx = Find(x),fy = Find(y);if(fx!=fy){f[fx]=fy;}return 0;
} int main()
{int caseNuym = 1;while(scanf("%d%d%d",&n,&m,&r)!=EOF) {for(int i=1;i<=n;i++)f[i]=i;memset(ans,0,sizeof(ans));for(int i=0;i<m;i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);for(int i=0;i<r;i++){scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].d);q[i].ord = i;}std::sort(e,e+m,compe);std::sort(q,q+r,compq);int head = 0;for(int i=0;i<r;i++){for(;(e[head].w>=q[i].d)&&(head<m);head++)Union(e[head].u,e[head].v);if(Find(q[i].u)==Find(q[i].v))ans[q[i].ord] = 1;else ans[q[i].ord] = 0;}printf("Case %d:\n",caseNuym ); for (int i=0;i<r;++i)if (ans[i]) puts("yes"); else puts("no"); ++caseNuym ; }}
View Code

 

F - Remember the Word
动态规划f[i]表示单词的i前缀串划分为集合中字符的方案数
转移方程  f[i]=sigma(f[i-s[j].len]) s[j]是word[0..i]一个后缀
边界        f[0]=1
实际上写的时候考虑的是向后更新会比较方便。
f[i+s[j].len]+=f[i] (s[j]是word[i..end]一个前缀)
利用字典树找到一个状态的所有后继。
#include <cstdio>
#include <cstring>
#include <queue>const long long maxnode    = 4010*100;
const long long SIGMA_SIZE = 26;
const long long maxlen     = 100;
const long long maxn       = 300010;
const long long MOD        = 20071027;using namespace std;char s[maxn];
int f[maxn];struct Trie
{int ch[maxnode][SIGMA_SIZE];int val[maxnode];int size;Trie(){clear();}void clear(){size=1;memset(ch[0],0,sizeof(ch[0]));memset(val,0,sizeof(val));}int index(char t){return t-'a';};int buildNewNode(int u){memset(ch[size],0,sizeof(ch[size]));val[size]=u;return size++;}void insert(char *s){int u = 0;for(;*s;s++){int c = index(*s);//忘记调用idx()WA了好几次if(!ch[u][c])ch[u][c]=buildNewNode(0);u=ch[u][c];}val[u]=1;//val[u]=v
    }void find(int i,char *s){int u=0,len=0;for(;*s;s++){int c = index(*s);//忘记调用idx()WA了好几次if(ch[u][c]){len++;u=ch[u][c];f[i+len]=(val[u]*f[i]+f[i+len])%MOD;//if(val[u]){find an end }
            }elsebreak;}}
};Trie trie;int main()
{int CaseNum = 0;while(scanf("%s",s)!=EOF){int n,len=strlen(s);memset(f,0,sizeof(f));f[0]=1;trie.clear();scanf("%d",&n);for(int i=0;i<n;i++){char key[110];scanf("%s",key);trie.insert(key);}for(int i=1;i<=len;i++)trie.find(i-1,s+i-1);printf("Case %d: %d\n",++CaseNum,f[len]);}return 0;
}
View Code

 

I - Cake slicing

4D/1D的动态规划,就是枚举这一刀是横切还是竖切,记忆化搜索。

#include <iostream>
#include <cstring>
#include <cstdio>using namespace std;const int maxn   = 20+10;
const int maxInt = 0x3f3f3f3f;int A[maxn][maxn],f[maxn][maxn][maxn][maxn];int sum(int x,int y,int a,int b){return A[a][b]-A[x-1][b]-A[a][y-1]+A[x-1][y-1];}int dfs(int x,int y,int a,int b){int S = sum(x,y,a,b),&ans=f[x][y][a][b];if(S==0)return maxInt;if(S==1)return 0;if(ans) return ans;ans=maxInt;for (int i = x; i < a; ++i){ans = min(dfs(x,y,i,b)+dfs(i+1,y,a,b)+b-y+1,ans);}for (int i = x; i < a; ++i){ans = min(dfs(x,y,a,i)+dfs(x,i+1,a,b)+a-x+1,ans);}return ans;
}int main(int argc, char const *argv[])
{int n,m,k,CaseNum=0;while(cin>>n>>m>>k){memset(A,0,sizeof(A));memset(f,0,sizeof(f));for(int i=0;i<k;i++){int x,y;cin>>x>>y;A[x][y]=1;}for (int i = 1; i <= n; ++i){for (int j = 1; j <= m; ++j){A[i][j]+=A[i-1][j]+A[i][j-1]-A[i-1][j-1];}}int ans = dfs(1,1,n,n);cout<<"Case "<<++CaseNum<<": "<<ans<<endl;}return 0;
}
View Code

 

 

 

转载于:https://www.cnblogs.com/lijianlin1995/p/3836578.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019展望:超级智能崛起,人类智慧与机器智能将深度融合

作者&#xff1a;刘锋 计算机博士 互联网进化论作者摘要&#xff1a;在2019年到来的脚步声中&#xff0c;感觉要写点文字&#xff0c;对2019年的科技趋势进行展望&#xff0c;也算是对2018年思考的总结&#xff0c;这篇展望的文章主要表达经过50年的科技和商业拉动&#xff0c;…

二叉树的一些leetcode题目+python(c++)

二叉树考点主要有: 1.三种遍历方式,以及构造二叉树等&#xff1b; 2.求深度,最长直径&#xff0c;最长路径,公共祖先等等; 3.合并二叉树&#xff0c;翻转二叉树&#xff0c;判断平衡性,对称性等; 4.从前序与中序构造二叉树&#xff0c;中序与后序构造二叉树&#xff0c;二叉…

Eclipse下如何导入jar包

原地址&#xff1a;http://blog.csdn.net/justinavril/article/details/2783182 我们在用Eclipse开发程序的时候&#xff0c;经常想要用到第三方的jar包。这时候我们就需要在相应的工程下面导入这个jar包。以下配图说明导入jar包的步骤。 1.右击工程的根目录&#xff0c;点击Pr…

面对“超人革命”,我们是否已做好准备?

来源&#xff1a;资本实验室人类自诞生以来&#xff0c;就一直处在自然规律的支配之下。但自从第一次制造工具并学会使用火的那一刻起&#xff0c;人类就开始走在了持续摆脱大自然生物束缚的道路上。千里听音、力大无穷、不死之身、翱翔天际、深入大洋……各种神话中无需借助外…

RepVGG

论文链接 一.背景: 现在的一些复杂模型虽然有很高准确度,但是缺点也很明显: 1.多分支,带来了速度的减慢和降低显存的使用率; 2.Mobilenet虽然采用可分离卷积.shufflenet采用分组卷积,带来了flop降低,但是却增加了内存的访问成本(MAC) 二.网络结构 1. 模型 RepVGG在train和…

2018十大科技丑闻,连娱乐圈都甘拜下风

来源&#xff1a;科技日报这一年里&#xff0c;风起云涌的科技界很忙有些人尝到了甜头有些人却吃到了苦头有些事件令人瞠目结舌、难以置信“404”教授梁莹120篇论文凭空蒸发韩春雨论文调查结果被吐槽酸碱体质论与心脏干细胞的创始人双双走下神坛日本福岛核电站污水处理报告错误…

华为究竟做了多少芯片?

来源&#xff1a;半导体行业观察华为依托于旗下的海思大举进军芯片的这个事实已经广为人知了。除了Kirin芯片外&#xff0c;华为在IPC视频编解码和图像信号处理的芯片、电视芯片&#xff0c;Balong基带和NB-IoT芯片等多个领域都取得不错的市场表现&#xff0c;也获得了大家的高…

leetcode hot100(第一部分) + python(c++)

1-1.两数之和 思路&#xff11;&#xff1a;两层for循环 &#xff2f;&#xff08;&#xff4e;2&#xff09; class Solution:def twoSum(self, nums, target):res []for i in range(len(nums)):for j in range(i1, len(nums)):if nums[i]nums[j]target:res.extend([i, j])b…

云计算深度报告:算力时代迎巨变

来源&#xff1a;中泰证券云计算正进入算力时代供给端:数据存量增长与计算成本下降推动算力需求增长信息技术快速发展与传统产业数据化转型带来大量数据存量。随着云计算、大数据、物联网、人工智能等信息技术的快速发展和传统产业数字化的转型&#xff0c;数据量呈现几何级增长…

c++将.cpp编译为.so文件

1.首先看文件形式 其中cpp1是直接调用.cpp和生成.so的文件夹。 cpp2是测试生成的.so可以使用的文件夹。 2.先直接编译.cpp检查代码没问题 a.cpp内容: #include <iostream> #include "a.h"void A::readImg(char* path) {B b;b.readImg(path);} a.h内容: …

vscode debug c++与opencv程序

一.工程代码 1.本文调试代码文件夹截图为: 2.代码细节: a.h: #ifndef A_H_ #define A_H_class A {public:A(){}~A(){}void readImg(const char* path);};#endif a.cpp: #include<opencv2/opencv.hpp> #include <iostream> #include "a.h"using name…

回顾 | 2018年十大AI新闻 中国继续占据主导优势

来源&#xff1a;网易智能摘要&#xff1a;普华永道&#xff08;PwC&#xff09;估计&#xff0c;到2030年&#xff0c;AI领域的发展将为全球经济贡献15.7万亿美元。本次评选出2018年十大AI新闻&#xff0c;它们囊括各个领域&#xff0c;有好有坏&#xff0c;从AI突破和新投资&…

新科技快速指南系列之“5G”:历史、现在与未来

来源&#xff1a;36氪摘要&#xff1a;5G仍然让人感觉很遥远。但是这些碎片正在拼凑在一起。未来取决于连通性&#xff08;connectivity&#xff09;。从人工智能和自动驾驶汽车到远程医疗和混合现实&#xff0c;再到迄今为止无法想象的技术&#xff0c;所有我们希望能够让我们…

torch版ResNet50(带有多输出)转c++ tensorrt

第一个最简单的lenet示例请参考这篇文章 一.torch阶段 测试图片: torch代码: # coding:utf-8 import torch from torch import nn from torch.nn import functional as F import torchvision import os import struct import time import cv2 import numpy as npdef main()…

新一轮全球“太空竞赛”正上演 争夺几万亿美元大蛋糕

来源&#xff1a;华尔街见闻摘要&#xff1a;太空竞赛不可避免受到民族自豪感的刺激和数万亿美元产业的诱惑。到2040年&#xff0c;摩根士丹利估计&#xff0c;太空经济规模将有1.1万亿美元&#xff1b;美国银行估计将达到2.7万亿美元。冷战时期的太空竞赛&#xff0c;又重新降…

ubuntu16.04编译安装c++ opencv与vscode配置debug

一&#xff0e;编译安装c opencv 1.下载zip包 本文安装的是opencv3.4.3,下载链接&#xff0c;以Sources方式下载zip包&#xff0e; 2.安装依赖 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat…

【年终盘点】2018年十大新型机器人

来源&#xff1a;网易智能摘要&#xff1a;2018年&#xff0c;机器人行业迎来了丰收——随着新型机器和高级人工智能的出现&#xff0c;各类机器人都在各自的领域都取得了重大的进步&#xff0c;例如家用机器人、工业机器人、医疗机器人、生物机器人和玩具机器人。今年&#xf…

leetcode hot100(第二部分) + python(c++)

50-1. 乘积最大子数组 思路1:找到状态转移方程: maxf[i]:表示在i处最大连乘数 minf[i]:表示在i处最小连乘数 maxf[i] max(nums[i],nums[i]*minf[i-1],nums[i]*maxf[i-1]) minf[i] min(nums[i],nums[i]*minf[i-1],nums[i]*maxf[i-1]) #maxf[i]:表示在i处最大连乘数 #minf[i]…

自动驾驶真的会来得那么快吗:关于自动驾驶的7个疑问

来源&#xff1a;资本实验室自动驾驶汽车的研发已经成为全球热潮。无论是像谷歌、百度、Uber这样的互联网巨头&#xff0c;还是丰田、通用、福特这样的老牌汽车制造商&#xff0c;都在以大量的人力、资金向自动驾驶领域下注。然而&#xff0c;无论是Waymo推出首个自动驾驶汽车商…

git的一些操作

一.git工作原理/流程: workspace: (除去.git)看见的目录。 版本库(Repository)&#xff1a;工作区有一个隐藏目录.git就叫版本库。其中版本库里面存了很多东西&#xff0c;最重要的就是stage(暂存区)&#xff0c;还有Git为我们自动创建了第一个分支master,以及指向master的一…