【求助大神!】CCF-CSP练习 垦田计划

CCF-CSP练习 垦田计划

CCF 202303-2 垦田计划


问题描述

在这里插入图片描述

输入格式

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

输出格式

在这里插入图片描述

样例输入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开始循环了,很纳闷,欢迎评价或私信,求解答!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值