2020-2-10新生赛

问题 C: Linear Approximation

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

Snuke has an integer sequence A of length N.

He will freely choose an integer b. Here, he will get sad if Ai and b+i are far from each other. More specifically, the sadness of Snuke is calculated as follows:

abs(A1−(b+1))+abs(A2−(b+2))+…+abs(AN−(b+N))
Here, abs(x) is a function that returns the absolute value of x.

Find the minimum possible sadness of Snuke.

Constraints
1≤N≤2×105
1≤Ai≤109
All values in input are integers.

输入

Input is given from Standard Input in the following format:

N
A1 A2 … AN

输出

Print the minimum possible sadness of Snuke.

样例输入 Copy

5
2 2 3 5 5

样例输出 Copy

2

提示

If we choose b=0, the sadness of Snuke would be abs(2−(0+1))+abs(2−(0+2))+abs(3−(0+3))+abs(5−(0+4))+abs(5−(0+5))=2. Any choice of b does not make the sadness of Snuke less than 2, so the answer is 2.

 

 

​​​​​​#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
ll sum=0,ans;
int A[mod];
bool cmp(int x,int y)
{
    return x<y;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&A[i]);
        A[i]-=i;
        sum+=(A[i]);
    }
    //ll l=0,r=0;
    sort(A+1,A+1+n,cmp);
   for(int i=1;i<=n;i++)
   {
      ans+=fabs(A[i]-A[(n+1)/2]);//减去中位数而已。。。
   }
   printf("%lld",ans);
    return 0;
}

 

 

#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
vector<char>A;
char str[30]="0123456789ABCDEFGHIJKL";
int main()
{
    int n,r;
    scanf("%d %d",&n,&r);
    int m=n;
    while(fabs(n))
    {
        int t=n%r;
        if(t<0)
            t+=fabs(r);
        A.push_back(str[t]);
         n -= t;
         n /= r;
    }
     //reverse(q.begin(), q.end());
     printf("%d=",m);
     int si=A.size();
     for(int i=si-1;i>=0;i--)
        printf("%c",A[i]);
        printf("(base%d)",r);
    return 0;
}

问题 K: 【动态规划】乘积最大

时间限制: 1 Sec  内存限制: 64 MB
[提交] [状态]

题目描述

 古人云:“不谋万世者,不足谋一时;不谋全局者,不足谋一域。”张琪曼通过研究惊奇地发现,每个人一生的幸福指数可以用一个长度为n的十进制数字字符串来表示,并且可以通过全局统筹安排,将幸福指数分成k+1个部分应用在她感兴趣的不同领域,从而使得总体幸福值最强,所谓幸福值最强,是指使得k个部分的乘积为最大。例如n=6,k=3,且数字字符串为“310143”时,此时可能有的情况有下列各种:
   3×1×0×143=0
   3×1×01×43=129
   3×1×014×3=126
   3×10×1×43=1290
   3×10×14×3=1260
   3×101×4×3=3630
   31×0×1×43=0
   31×01×4×3=372
   310×1×4×3=3720
从上面的结果可以看出,最大乘积为310×1×4×3=3720。
现在的问题时,当n,数字串和k给出之后,找出一种分法使其乘积为最大。

输入

第一行为两个整数,即n和k, 6≤n≤40,1≤k≤6
第二行为数字字符串。

输出

一个整数,即最大乘积。

样例输入 Copy

6 3
310143

样例输出 Copy

3720

这道题不用动态规划。。。。好吧,可能是数据量比较友好,不然LL 早爆了。

 

 

#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
char str[50];
int n,cnt,t=0,len;
ll ans=0;
int num(int i,int j)
{
    int sum=0;
    for(int k=i; k<=j; k++)
    {
        sum=sum*10+str[k]-'0';
    }
    return sum;
}
void dfs(int s,int k,ll sum)
{
    if(k==cnt)
    {
        sum*=num(s,len-1);
            if(ans<sum)
                ans=sum;
    }
    else
    {
        for(int i=s; i<len; i++)
        {
            dfs(i+1,k+1,sum*num(s,i));
        }
    }
}
int main()
{

    scanf("%d %d",&n,&cnt);
    scanf("%s",str);
    len=strlen(str);
    dfs(0,0,1);
    printf("%lld",ans);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值