10月集训test6
来源:互联网 发布:北京软件定制开发 编辑:程序博客网 时间:2024/06/09 23:11
嗯喵 test6 算是一个不错的进步,A了两道题的感觉不是一般的好。
不过也可能是这次的题比较简单?^_^
1.机器
豆豆家里有一个万能的机器,豆豆想让这个机器帮他做作业。但是这个机器本身有一些任务需要完成,等到空闲的时候才能帮豆豆完成作业。
这个机器效率很高,完成任何任务都只需要一个单位的时间。
机器工作表上有 n 个任务,机器在 ti 时间开始执行第i个任务。
现在豆豆有 m 个询问,每个询问有一个数字 q ,表示如果在 q 时间把作业交给机器,何时这个机器才开始做作业。
机器总是按照时间顺序执行工作表,当机器空闲时立即帮豆豆做作业。m 个询问之间是无关的。
输入格式
第一行有两个数字 n, m ,表示工作表里面有 n 个任务, 有 m 个询问;
第二行有 n 个不同的数字 t1, t2, t3,….tn ,表示机器在 ti 时间执行第 i 个任务。
接下来 m 行,每一行有一个数字 q ,豆豆的一个询问。
输出格式
每个询问输出一个整数表示机器开始做作业的时间。
样例数据
输入
5 5
1 2 3 5 6
1
2
3
4
5
输出
4
4
4
4
7
备注
【数据范围】
对于 80% 的数据,n,m≤1000;1≤ti≤1000;1≤q≤1000;
对于 100% 的数据,1≤n,m≤100000;1≤ti≤200000;1≤q≤200000;ti互不相同。
首先先输入机器执行任务的时间,预处理出它有哪些时间是空闲的。然后把之前的所有事都挪在这一刻来做,就酱。
#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>using namespace std;int n,m,x;int c[200010];bool a[200010];inline int read(){ int i=0,f=1; char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-') f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0'; return i*f;}int main(){ //freopen("machine.in","r",stdin); //freopen("machine.out","w",stdout); memset(a,false,sizeof(a)); n=read(),m=read(); for(int i=1;i<=n;++i) { x=read(); a[x]=true; } for(int i=200005;i>=1;i--) { if(!a[i]) c[i]=i; else c[i]=c[i+1]; } for(int i=1;i<=m;++i) { x=read(); cout<<c[x]<<endl; } return 0; }
2.立方数
豆豆还是觉得自己智商太低了,就又去做数学题了。一看到题,他就觉得自己可能真的一点智商都没有。便哭着跑来像 dalao 求教:
如果存在正整数 A,B ,满足 A3 - B3 = x ,则称质数 x 为立方数。现在给你一个质数 x ,请判断是不是立方数,如果是请输出 “YES” ,否则输出 “NO” 。
输入格式
第一行一个整数 T 表示数据组数;
接下来 T 行,每行一个数字 x ;
输出格式
输出 T 行表示每个问题的答案。
样例数据
输入
10
2
3
5
7
11
13
17
19
23
29
输出
NO
NO
NO
YES
NO
NO
NO
YES
NO
NO
备注
【数据范围】
对于 40% 的数据,如果有解 A 在 10000 以内;
对于 100% 的数据,T≤1000;1≤x≤10^12。
【思考】
如果是以下数据范围,怎么做?
对于 100% 的数据,T≤100000;1≤x≤10^12。
看破红尘的人一声冷笑。
这,是,计,算,机,题,吗。。。。。摔!!!明,明,是,数,学,题。。。。。。所以为什么要管复杂度,不,是,一,样,的,吗。。。
首先,咳,a^3-b^3=(a^2+ab+b^2)(a-b),因为x为质数,则(a^2+ab+b^2)和(a-b)一个肯定是1,另一个是x本身。又a,b都是正整数,所以(a^2+ab+b^2)一定不为1。
得 a-b=1,a^2+ab+b^2=x
又 a^2+ab+b^2=(a-b)^2+3ab
得 x-1必为3的倍数,首先排除一部分。
然后由ab=(x-1)/3解出ab的值,再根据(a-b)^2=1,算出(a+b)^2的值。
若是平方开方后所得的为整数,则有解,否则无解。
#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>using namespace std;int t;long long x,ab;int main(){ //freopen("cube.in","r",stdin); //freopen("cube.out","w",stdout); cin>>t; while(t--) { cin>>x; if((x-1)%3==0) { ab=(x-1)/3; long long aa=1+4*ab; double xx=sqrt(aa); if(xx-(int)xx/1==0) cout<<"YES"<<endl; else cout<<"NO"<<endl; } else cout<<"NO"<<endl; } return 0;}
3.长跑路径
企鹅豆豆即将要去考长跑了,但是作为一只企鹅,长跑自然比不过鸵鸟和鸡。为了公平起见,教练告诉豆豆,他可以从 K 个指定地点中选择两个不同的地点分别作为起点和终点来考试。
考试地图是一个由 N 个点 M 条边组成的没有重边和自环的连通无向图,一条边的长度为 Ai 。
豆豆想知道他的长跑考试最少需要跑多远。
输入格式
第一行一个整数 T 表示数据组数;
每组数据第一行两个整数 N,M 表示点数和边数。
接下来 M 行每行三个数 U,V,A 表示从 U 到 V 有一条长度为 A 的路径。
接下来一行一个整数 K 表示可选地点个数。
接下来一行 K 个互不相同的整数表示可选地点的编号。
输出格式
对于每组数据输出一个整数表示答案。
样例数据
输入
1
5 6
1 2 1
2 3 3
3 1 3
2 5 1
2 4 2
4 3 1
3
1 3 5
输出
2
备注
【数据范围】
对于 30% 的数据,K≤4;
对于另外 10% 的数据,K=N;
对于另外 30% 的数据,M=N-1;
对于 100% 的数据,1≤N,M≤100000;T≤5;1≤K≤n;1≤边长≤100000。
首先标记可以选的点,然后就是dijkstra最短路一阵乱搞。。。。。
据说应该卡掉但不知道为什么过了。。。。
#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#include<queue>#include<vector>#define ll long longusing namespace std;int getint() { int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-')c=getchar(),f=-1; for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f;}const int N=100005;const ll INF=1e17; int t,n,m,k;int tot,first[N],next[N<<1],to[N<<1],w[N<<1];ll dis[N],f[N],dis1[N],dis2[N],ans;int key[N];priority_queue<pair<ll,int> >q;inline void add(int x,int y,int z){ next[++tot]=first[x]; first[x]=tot; to[tot]=y; w[tot]=z;}void dfs(int u,int fa){ if(key[u]) dis1[u]=dis[u]; for(int e=first[u];e;e=next[e]) { int v=to[e]; if(v!=fa) { dis[v]=dis[u]+w[e]; dfs(v,u); if(dis1[v]<dis1[u]) dis2[u]=dis1[u],dis1[u]=dis1[v]; else if(dis1[v]<dis2[u]) dis2[u]=dis1[v]; } } f[u]=dis1[u]+dis2[u]-2*dis[u];}void dp(){ for(int i=1;i<=n;i++) dis[i]=0,dis1[i]=dis2[i]=INF; dfs(1,0); for(int i=1;i<=n;i++) ans=min(ans,f[i]); cout<<ans<<endl;}void dijkstra(int s){ for(int i=1;i<=n;i++)dis[i]=INF; while(!q.empty()) q.pop(); dis[s]=0; q.push(make_pair(0,s)); while(!q.empty()) { int u=q.top().second; q.pop(); if(u!=s&&key[u]) { ans=min(ans,dis[u]); break; } for(int e=first[u];e;e=next[e]) { int v=to[e]; if(dis[u]+w[e]<dis[v]) { dis[v]=dis[u]+w[e]; q.push(make_pair(-dis[v],v)); } } }}int main(){ //freopen("path.in","r",stdin); //freopen("path.out","w",stdout); int x,y,z; t=getint(); while(t--) { n=getint(),m=getint(); tot=0; ans=INF; for(int i=1;i<=n;i++) first[i]=key[i]=0; for(int i=1;i<=m;i++) { x=getint(),y=getint(),z=getint(); add(x,y,z),add(y,x,z); ans=min(ans,1ll*z); } k=getint(); for(int i=1;i<=k;i++) x=getint(),key[x]=1; if(k==n) { cout<<ans<<endl; continue; } ans=INF; if(m==n-1) { dp(); continue; } for(int i=1;i<=n;i++) if(key[i]) dijkstra(i); cout<<ans<<endl; } return 0;}
最近天气还好,喵呜~
来自2017.10.14.
——我认为return 0,是一个时代的终结。
- 10月集训test6
- 暑假集训test6
- 10月集训test3
- 10月集训test4
- 10月集训test5
- 10月集训test7
- 10月集训test8
- 10月集训test9
- 10月集训test10
- 10月集训test11
- 10月集训test12
- 10月集训test13
- 10月集训test14
- 10月集训test15
- 10月集训test16
- 10月集训test20
- 10月集训test19
- test6
- EA&UML日拱一卒-状态图::延缓事件
- 解决GVIM中C-A组合键不起作用的问题
- Hibernate OneToOne注解关联查询案例
- DefaultAnnotationHandlerMapping不起作用,分析原因
- int ,long , long long类型的范围
- 10月集训test6
- 相机自动标定开发-第三阶段
- web项目中 .js .css .png 等文件无法加载的一种原因
- python字符串操作学习小结
- 24. Swap Nodes in Pairs
- 事件分发机制
- 2017-10-16-Mysql的常用数据类型
- C#226课的主要内容
- tf.shape和get_shape()