嗯喵 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 long
using 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,是一个时代的终结。