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

来源:互联网 发布:淘宝官网投诉电话 编辑:程序博客网 时间:2024/05/16 18:07

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[N],b[N];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[N],b[N],dp[N];int 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[n]*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输入210 5 15 4 1输出84备注:1T10000,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;}
阅读全文
0 0
原创粉丝点击