https://www.nowcoder.com/acm/contest/181#question
A.斐波那契
求F[n-1]*F[n+1]-F[n]*F[n]
打表发现规律,1,-1,1,-1,1,-1。。。。。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
char s[1000001];
int main()
{
while(cin>>s)
{
if ((s[strlen(s)-1]-'0')&1)
{
cout<<"-1"<<endl;
}
else
{
cout<<"1"<<endl;
}
}
return 0;
}
B.送分题
a+b
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
long long a,b,c;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
C.序列
一个长度为n的序列能否被分成k段
数的总和不是k的倍数,分不了,然后挨个加起来判断就行,暴力可以过,判断次数都是骗人的
#include <cstdio>
#include <algorithm>
using namespace std;
long long a[200000];
long long sum,n,m,v;
int main()
{
scanf("%lld%lld",&n,&m);
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
while(m--)
{
scanf("%lld",&v);
if (sum%v)
{
puts("No");
continue;
}
long long t=sum/v;
long long num=0,res=0;
for(int i=1;i<=n;i++)
{
res+=a[i];
if (res==t)
{
num++;
res=0;
}
}
if (num==v)
{
puts("Yes");
continue;
}
else
{
puts("No");
continue;
}
}
return 0;
}
D.小叶的巡查
树的直径 模版题
-
树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;
-
原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点
-
1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)
-
2) 如果u不是直径上的点,则u到v必然于树的直径相交(反证),那么交点到v 必然就是直径的后半段了,所以v一定是直径的一个端点,所以从v进行BFS得到的一定是直径长度
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define ll long long
using namespace std;
int n,s,cnt;
long long ans;
struct EDGE
{
int next,to,val;
} edge[233330];
int head[33333],vis[33333];
long long dis[33333];
void add(int from,int to,int val)
{
edge[++cnt].next=head[from];
edge[cnt].to=to;
edge[cnt].val=val;
head[from]=cnt;
}
void dfs(int u,int fa)
{
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if (v!=fa)
{
dis[v]=dis[u]+edge[i].val;
if (dis[v]>ans)
{
ans=dis[v];
s=v;
}
dfs(v,u);
}
}
}
int main()
{
scanf("%d",&n);
for (int i=1; i<n; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
dis[1]=0;
dfs(1,0);
dis[s]=0;
dfs(s,0);
printf ("%lld\n",ans*(21+ans)/2);
return 0;
}
E.旅行青蛙
最长非降子序列,(最长上升子序列的变形)
模版题
#include<cstdio>
#include<iostream>
#include <algorithm>
using namespace std;
int dp[23334];
int a[23334];
int main()
{
int n=1;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
dp[1]=a[1];
int len=1;
for (int i=2;i<=n;i++)
{
if (a[i]>=dp[len])
{
dp[++len]=a[i];
}
else
{
int j=upper_bound(dp+1,dp+len+1,a[i])-dp;
dp[j]=a[i];
}
}
printf ("%d\n",len);
return 0;
}