题意:
给你一个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;
}