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

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-1int tmp=(a[i]+b[0])%k,cnt=1;
            bool flag=1;
            for(int j=i+1;jm;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 
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define rep(i,a,n) for(int i=a;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
输入
2
10 5 1
5 4 1
输出
8
4
备注:
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之间的电阻。
2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛_第1张图片
输入描述:
第一行输入一个整数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;
}

你可能感兴趣的:(题集,NowCoder)