HDU1735 字数统计 贪心

HDU1735 字数统计


题面:

将 n * l 文字分成 m 个合法的段落,使得剩下的空格数最少。
图示


解题过程:

  • 题目对于合法段落的定义不清楚。开始我认为会有完全的空行(甚至多个连续的空行),这样的空行最少要有一个在开头或者在第三的非空格(因为一个字符也没有的话,这种空行不应该出行在原文中),但它的意思是直接统计上一行末尾的空格个数就行了。
  • 一次运行多组输入,忘记了清空用来排序的优先队列,WA了很久。WAwawawaawawawawaQaQ

AC代码:

#include<iostream>
#include<map>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
#define fread() freopen("in.txt","r",stdin)
#define rep(i,l,p) for(int i=l;i<=p;i++)
#define Fi first
#define Se second
typedef long long ll;
typedef pair<int,int> P;
int n,l,m;
ll sum;
int a[10005],b[10005];
priority_queue<int > q;
int main(int argc, char const *argv[])
{
    //fread();
    ios::sync_with_stdio(false);
    int t;
    while(cin >> n >> l >>m){
        while(!q.empty()) q.pop();  //之前的q可能非空
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        sum = 0;

        rep(i,1,n) {
            int f = 1;
            rep(j,1,l){
                cin >> t;
                if(t == 1){
                    if(f == 1) f = 0; 
                    b[i]=0;
                }else{
                    sum++;
                    if(f == 1) a[i]++;
                    b[i]++;
                }

            }
            //b[i] = max(l-1,b[i]);
            if(i> 1 && a[i] >= 2){
                q.push(2+b[i-1]);
            }

        }
//  rep(i,1,n)cout << b[i] << endl;
        ll res = 0;
        rep(i,1,m-1){ 
            res += q.top();
            q.pop();
        }
        res += 2 + b[n];
        cout << sum-res << endl;
    } 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Hagtaril/article/details/81351212