codeforces#291(div.2)D题
2015-02-15 11:40
218 查看
仔细想想还是比较简单的。
dp[i]表示能破坏以i号机器人结尾的连续最长序列的长度。
dp[i]=dp[i-1]+1,当sum<=k;(加上i号机器人用的导弹数不会超过k);
否则dp[i]=1,当i号机器人用的导弹数不超过k,然后再往前去加机器人,如果加上i-1号机器人用的导弹数不会超过k,那么dp[i]++;以此往前推,直到不能加为止;
否则dp[i]=0,当i号机器人用的导弹数就超过了k。
下面是代码:
#include<iostream>
#include<cstring>
using namespace std;
int dp[100005];//能破坏以i号机器人结尾的连续最长序列的长度。
int a[100005][6];
int s[100005];//每个机器人细节总和;
int maxx[100005][6];
int main()
{
memset(s,0,sizeof(s));
int n,m,k,ans=0,maxn=0;
cin>>n>>m>>k;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
cin>>a[i][j];
s[i]+=a[i][j];
}
}
if(s[0]<=k){
dp[0]=1;
for(int i=0;i<m;++i)
maxx[0][i]=a[0][i];
}
else {
dp[0]=0;
for(int i=0;i<m;++i)
maxx[0][i]=0;
}
for(int i=1;i<n;++i)
{
int sum=0;
for(int j=0;j<m;++j)
{
maxx[i][j]=max(maxx[i-1][j],a[i][j]);
sum+=maxx[i][j];
}
if(sum<=k)dp[i]=dp[i-1]+1;
else{
if(s[i]<=k){
dp[i]=1;
for(int j=0;j<m;++j)
maxx[i][j]=a[i][j];
for(int I=i-1;I>=0;I--)
{
sum=0;
for(int j=0;j<m;++j)
{
sum+=max(maxx[i][j],a[I][j]);
}
if(sum<=k){
dp[i]++;
for(int j=0;j<m;++j)
{
maxx[i][j]=max(maxx[i][j],a[I][j]);
}
}
else{
break;
}
}
}
else {
dp[i]=0;
for(int j=0;j<m;++j)
maxx[i][j]=0;
}
}
if(dp[i]>=maxn){
ans=i;
maxn=dp[i];
}
}
for(int j=0;j<m;++j){
if(j==0)
cout<<maxx[ans][j];
else
cout<<' '<<maxx[ans][j];
}
cout<<endl;
return 0;
}
dp[i]表示能破坏以i号机器人结尾的连续最长序列的长度。
dp[i]=dp[i-1]+1,当sum<=k;(加上i号机器人用的导弹数不会超过k);
否则dp[i]=1,当i号机器人用的导弹数不超过k,然后再往前去加机器人,如果加上i-1号机器人用的导弹数不会超过k,那么dp[i]++;以此往前推,直到不能加为止;
否则dp[i]=0,当i号机器人用的导弹数就超过了k。
下面是代码:
#include<iostream>
#include<cstring>
using namespace std;
int dp[100005];//能破坏以i号机器人结尾的连续最长序列的长度。
int a[100005][6];
int s[100005];//每个机器人细节总和;
int maxx[100005][6];
int main()
{
memset(s,0,sizeof(s));
int n,m,k,ans=0,maxn=0;
cin>>n>>m>>k;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
cin>>a[i][j];
s[i]+=a[i][j];
}
}
if(s[0]<=k){
dp[0]=1;
for(int i=0;i<m;++i)
maxx[0][i]=a[0][i];
}
else {
dp[0]=0;
for(int i=0;i<m;++i)
maxx[0][i]=0;
}
for(int i=1;i<n;++i)
{
int sum=0;
for(int j=0;j<m;++j)
{
maxx[i][j]=max(maxx[i-1][j],a[i][j]);
sum+=maxx[i][j];
}
if(sum<=k)dp[i]=dp[i-1]+1;
else{
if(s[i]<=k){
dp[i]=1;
for(int j=0;j<m;++j)
maxx[i][j]=a[i][j];
for(int I=i-1;I>=0;I--)
{
sum=0;
for(int j=0;j<m;++j)
{
sum+=max(maxx[i][j],a[I][j]);
}
if(sum<=k){
dp[i]++;
for(int j=0;j<m;++j)
{
maxx[i][j]=max(maxx[i][j],a[I][j]);
}
}
else{
break;
}
}
}
else {
dp[i]=0;
for(int j=0;j<m;++j)
maxx[i][j]=0;
}
}
if(dp[i]>=maxn){
ans=i;
maxn=dp[i];
}
}
for(int j=0;j<m;++j){
if(j==0)
cout<<maxx[ans][j];
else
cout<<' '<<maxx[ans][j];
}
cout<<endl;
return 0;
}
相关文章推荐
- codeforces Round #117 Div.2 182E. Wooden Fence
- codeforces Round #184 Div.2 - B Continued Fractions
- Codeforces Round#194(Div.2) A Candy Bag
- CodeForces#203(Div.2)- A,B,C
- codeforces round#235 (div.2) A,B,C
- codeforces round #236 div.2 C
- CF#256(Div.2) A. Rewards
- Round #186 (Div.2) Ilya and Matrix
- Codeforces Round #266 (Div.2) B Wonder Room --枚举
- TopCoder SRM 639 Div.2 500 AliceGameEasy --乱搞
- Szucoder Round #4 (div.2)
- CodeForces Round #288 Div.2
- CodeForces #292 div.2 题解
- CodeForces Round #295 Div.2
- #290 (div.2) B. Fox And Two Dots
- CodeForces Round #297 Div.2 E (中途相遇法)
- #308 (div.2) C. Vanya and Scales
- codeforces Round 314 div.2
- BestCoder Round #50 (div.2) HDU 5365 Run(简单几何)
- BestCoder Round #51 (div.2)