一月三日C,D题题解

题意:

给你一个a数组,一个k,一遍一遍的从左到右扫数组,扫到i时,如果ai大于0,ai--,k--。

当k减到0时,输出a。

思路:

a存进pair类型的b里,给b排序,再用b算出共要扫几轮,a减去后输出a.

注意:

上午没想到排序,导致卡住,T掉了。

但是WA……

WA代码:

#include<bits/stdc++.h>

#define ll long long

using namespace std;

pair<ll,ll> b[100005];

ll a[100005],k;

set<ll> s;

ll n;

bool cmp(pair<ll,ll> x,pair<ll,ll> y){

return x.second<y.second;

}

int main(){

scanf("%lld%lld",&n,&k);

for(int i=1;i<=n;i++){

scanf("%lld",&a[i]);

s.insert(i);

b[i].first=i;

b[i].second=a[i];

}

sort(b+1,b+1+n,cmp);

ll sum=0,mns=0;

int j=1;

while(sum+(b[j].second-mns)*s.size()<k){

sum+=(b[j].second-mns)*s.size();

s.erase(b[j].first);

mns=b[j].second;

j++;

if(j>n){

for(int i=1;i<=n;i++){

printf("0 ");

}

return 0;

}

}

mns+=(k-sum)/s.size();

j=(k-sum)%s.size();

if(j>0){

mns++;

}

int j2=j;

for(int i=1;i<=n;i++){

if(j>0){

if(s.count(i)&&j2>0){

j2--;

printf("%lld ",a[i]-mns);

}

else{

printf("%lld ",max(a[i]-mns+1,(ll)0));

}

}

else{

printf("%lld ",max(a[i]-mns+1,(ll)0));

}

}

return 0;

}

题意:

共n块蛋糕两人轮流吃,每次可以吃ai块(ai<n)。问先吃者最多吃到几块。

思路:

略(一眼DP但是写不出转移方程)

注意:

因为是先选所以不用分ab两个数组。

AC代码:

#include<bits/stdc++.h>

using namespace std;

int a[10005];

int sum[105];

int main(){

int n,m;

scanf("%d%d",&n,&m);

for(int i=1;i<=m;i++){

scanf("%d",∑[i]);

}

for(int i=1;i<=n;i++){

for(int j=1;j<=m;j++){

if(i>=sum[j]){

a[i]=max(a[i],i-a[i-sum[j]]);

}

}

}

printf("%d",a[n]);

return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值