CCF-CSP练习 垦田计划
CCF 202303-2 垦田计划
问题描述
输入格式
输出格式
样例输入1
4 9 2
6 1
5 1
6 2
7 1
样例输出1
5
样例解释
样例输入2
4 30 2
6 1
5 1
6 2
7 1
样例输出2
2
样例解释
子任务
我的提交
#include<bits/stdc++.h>
using namespace std;
struct ktjh{
int t,c;
int mr;//最多可投入的单位资源数
int re;//已投入的单位资源数
}kt[10006];
int inc(const void *a,const void *b)//结构体二级排序
{
if((*(ktjh *)a).t!=(*(ktjh *)b).t)
return (*(ktjh * )a).t<(*(ktjh * )b).t ? 1:-1;//降序
else return (*(ktjh *)a).c-(*(ktjh *)b).c;//升序
}
int main()
{
int n,m,k,i,j,mt;
cin>>n>>m>>k;
for(i=0;i<n;i++)
{
cin>>kt[i].t>>kt[i].c;
kt[i].mr=kt[i].c*(kt[i].t-k);
}
qsort(kt,n,sizeof(ktjh),inc);
while(m>0)
{
for(i=0;i<n;i++)
{
//cout<<"i="<<i<<endl;
bool f=true;
while(kt[i].mr>kt[i].re&&kt[i].t>=kt[i+1].t)
{
kt[i].t--;
kt[i].re+=kt[i].c;
m-=kt[i].c;//cout<<m<<endl;
if(m<=0||kt[i].mr<kt[i].re||kt[i].t<k)
{
kt[i].t++;
kt[i].re-=kt[i].c;
f=false;
break;
}
}
qsort(kt,n,sizeof(ktjh),inc); mt=kt[0].t;
i=-1;
if(!f) break;
}
if(mt==k)
{
cout<<k<<endl;return 0;
}
}
cout<<mt<<endl;
}
/*
//检验排序
for(i=0;i<n;i++)
{
cout<<i<<" "<<kt[i].t<<" "<<kt[i].c<<endl;
}
*/
提交结果
我的思路
(在没考虑到用二分法的前提下)
以样例输入1为例,我先把他们排序成
7 1
6 1
6 2
5 1
在符合while的条件下,从最上面开始减,第一次减成
6 1
6 1
6 2
5 1
这时候还符合,继续减,第二次减成
5 1
6 1
6 2
5 1
此时不符合条件kt[i].t>=kt[i+1].t了,跳出循环,排序成
6 1
6 2
5 1
5 1
i=0,又从头循环,减成
5 1
6 2
5 1
5 1
又不符合条件,跳出循环,排序成
6 2
5 1
5 1
5 1
……以此类推。但是在检验输出时我发现在第一次跳出循环后kt[0]的数据就没变过,因而检验发现是i的问题,把“i=0”改成“i=-1”后输出正确。
我的问题
在while循环外的“i=-1”处,原本我写的是“i=0”,但发现再进入for循环i就从1开始循环了,很纳闷,欢迎评价或私信,求解答!