问题 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;
}