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