您的位置:首页 > 理论基础 > 计算机网络

2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛

2017-12-23 17:28 447 查看
https://www.nowcoder.com/acm/contest/63/B

栗酱的文明2

分析:排序

https://www.nowcoder.com/acm/contest/63/E

E 栗酱的数列

栗酱有一个长度为n的数列A,一个长度为m的数列B,现在询问A中有多少个长度为m的连续子序列A’,

满足(a’1+b1)%k = (a’2+b2)%k = …… = (a’m + bm)%k。

输入描述:

第一行一个数T,表示有T组数据。

对于每组数据,

第一行三个整数,n, m, k。

第一行输入n个数, a1,a2,…,an, 表示A数列中的数,

第二行输入m个数, b1,b2,…,bm, 表示B数列中的数。

输出描述:

每一组数据输出一行,满足条件的连续子序列数量。

示例1

输入

2

3 2 5

7 8 7

8 7

3 2 5

7 8 9

8 7

输出

1

2

备注:

T≤15,

2≤m≤n≤2×105,

1≤ai,bi,k≤109

分析:RT 正解是KMP。。, 看数据和时间,就暴力了。。

int a
,b
;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
rep(i,0,n) scanf("%d",&a[i]);
rep(i,0,m) scanf("%d",&b[i]);
int ans=0;
for(int i=0;i+m-1<n;i++)
{
int tmp=(a[i]+b[0])%k,cnt=1;
bool flag=1;
for(int j=i+1;j<i+m;j++,cnt++)
{
if(tmp!=(a[j]+b[cnt])%k)
{
flag=0;
break;
}
}
if(flag) ans++;
}
printf("%d\n",ans);
}
return 0;
}


https://www.nowcoder.com/acm/contest/63/F

栗酱的不等式

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 131072K,其他语言262144K

64bit IO Format: %lld

题目描述

有不等式y⋅x3≤ n,已知y为正整数,x为大于1的正整数,问当x和y的解数量刚好为m的时候n的最小值,如果不存在输出 -1。

输入描述:

多组数据读入。

每组数据一个数字m,如题所示。

输出描述:

每组数据输出一行,输出答案。

示例1

输入

1

输出

8

说明

当方案恰好只有一种的时候,n的最小值为8,此时y=1,x=2。

备注:

1 ≤ m ≤ 1016

分析:看题目数据 ,太大。。 1s

二分法

ll check(ll cnt)///检索解的个数
{
ll ans=0;
for(ll x=2; x*x*x<=cnt; x++) ans+=cnt/(x*x*x);
return ans;
}
int main()
{
ll m;
while(~scanf("%lld",&m))
{
ll le=2,mid,ri=1e16;
while(le<=ri)
{
mid=(le+ri)/2;
if(check(mid)>=m) ri=mid-1;
else le=mid+1;
}
printf("%lld\n",check(le)==m?le:-1);
}
return 0;
}


https://www.nowcoder.com/acm/contest/63/G

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 131072K,其他语言262144K

64bit IO Format: %lld

题目描述

给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值。

输入描述:

第一行一个数T,表示有T组数据。

对于每组数据,第一行一个整数n,

接下来两行分别给出A数列与B数列。

输出描述:

每一组数据输出一行,最大的∑vi。

示例1

输入

2

2

1 1000

2 1

5

1 3 5 2 4

1 2 3 4 5

输出

2001

52

说明

对于第二个样例,

第一次从左边取走a1,v1=a1⋅b1=1,

第二次从左边取走a2,v2=a2⋅b2=6,

第三次从右边取走a5,v3=a5⋅b3=12,

第四次从右边取走a4,v4=a4⋅b4=8,

第五次取走剩下的a3,v5=a3⋅b5=25。

总价值∑vi=1+6+12+8+25=52

备注:

T≤10

1≤n≤103

1≤ai,bi≤103

分析: 想着是dp。。 还是没做出来。。

dp[i][j]表示第i次取数后右面共取j个的最大值

状态转移:

dp[i][j]=max(dp[i-1][j-1]+i*a[n-j+1],dp[i-1][j]+i*a[i-j]);(j<=i)

第i次只与第i-1次有关,可以压缩空成一维

#include <bits/stdc++.h>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define rep(i,a,n) for(int i=a;i<n;i++)
#define pb push_back
#define fi first
#define se second
#define sz(a) (a.size)
#define lb lower_bound
#define ub upper_bound
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef long long ll;
typedef unsigned long long ull;
const int MOD=1e9+7;
const double eps=1e-6;
const int INF=0x3f3f3f3f;
const double pi=acos(-1.0);
const int N=1e3+5;
const int dir[4][2]= {0,1,1,0,0,-1,-1,0};
int a
,b
,dp
;
in
11540
t main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
rep(i,1,n+1) scanf("%d",&a[i]);
rep(i,1,n+1) scanf("%d",&b[i]);
mem(dp,0);
dp[0]=a[1]*b[1];
dp[1]=a
*b[1];
rep(i,2,n+1)
{
for(int j=i;j>=0;j--)
{
if(!j) dp[j]+=a[i]*b[i];
else dp[j]=max(dp[j-1]+b[i]*a[n-j+1],dp[j]+b[i]*a[i-j]);
}
}
int mx=-INF;
rep(i,0,n+1) mx=max(mx,dp[i]);
printf("%d\n",mx);
}
return 0;
}


https://www.nowcoder.com/acm/contest/63/K

K qwb的骚扰

题目描述
自从学姐拒绝了qwb之后,qwb开始了疯狂的骚扰。qwb来到了一个公共电话亭,他摸摸口袋只有n元钱。
已知该公用电话的规则是,前3分钟一共收费x元(不到3分钟也要收x元),超过3分钟每分钟收费y元(不到1分钟也要收y元)。(先扣钱再打电话。)
那么问题来了,qwb最多骚扰学姐几分钟?(假设学姐不会挂qwb电话)
输入描述:
第一行输入一个整数T,表示数据组数,
接下来T行,每行三个整数n,x,y 。
输出描述:
每行输出一个整数,表示qwb最多骚扰学姐的分钟数。
示例1
输入
2
10 5 1
5 4 1
输出
8
4
备注:
1≤T≤10000,
1≤n,x,y≤10000


分析:特别坑 !!! 不理解假设学姐不会挂断电话, 可是还有qwb挂断电话这种操作。。

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,x,y;
scanf("%d%d%d",&n,&x,&y);
if(n<x) puts("0");
else if(3*y<=x)
printf("%d\n",3+(n-x)/y);
else if(3*y>x)
printf("%d\n",3*(n/x)+(n%x)/y);
else if(y>x)
printf("%d\n",3*(n/x));
}
return 0;
}


https://www.nowcoder.com/acm/contest/63/L

qwb与电阻

题目描述

qwb闲着无聊,就开始拆自己的电脑,他发现主板上某个元件可以视作如图所示无限长的电路。已知该电路由三种不同的电阻r1,r2,r3构成,他想要计算ab之间的电阻。



输入描述:

第一行输入一个整数T,表示数据组数,

接下来T行,每行三个整数r1,r2,r3。

输出描述:

每组数据输出一行,保留两位小数。

示例1

输入

2

1 1 1

1 2 3

输出

2.73

5.46

备注:

T≤104,

1≤r1,r2,r3≤104

分析:等效电阻。

也有推导出公式的, 公式:ans=(r1+r3+sqrt((r1+r3)(r1+r3)+4*r2(r1+r3))/2

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
double a,b,c,ans;
scanf("%lf%lf%lf",&a,&b,&c);
ans=a+b+c;
rep(i,0,100) ans=1.0/(1.0/ans+1.0/b)+a+c;
printf("%.2lf\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络赛
相关文章推荐