hdu 5742 简单贪心

点击打开链接

	#include <iostream>
	#include <algorithm>
	#include <cstring>
	#include <cmath>
	using namespace std;
	const int M =1100;
	int a[M];
	int gcd(int a,int b)
	{
		if(a%b==0)
		return b;
		else
		{
			return gcd(b,a%b);
		}
	}
	int main()
	{
		int t;
		cin>>t;
		while(t--)
		{
			int a1,a2,sum=0;
			int n,m;
			cin>>n>>m;
			memset(a,-1,sizeof(a)); // a[i]==-1 代表没有被确定 
			
			while(m--)
			{
				int x,y;
				cin>>x>>y;
				a[x]=y;
			}	
			//(a1+a2)/sum(a); //要最大  所以使 a1,a2尽量大 sum尽量小 
			//The sequence is non-increasing 非递增 从右边开始确定
			a[n+1]=0;// 如果a[n]没确定 sum要小,则an为0 
			for(int i=n;i>2;i--)
			{
				// a[i+1]<=a[i] 当a[i+1]确定时  a[i]最小值为a[i+1] 
				if(a[i]==-1)
				{
					a[i]=a[i+1];
				}
				sum+=a[i];
			} 
			
			
			if(a[1]==-1&&a[2]==-1)
			{
				a[1]=a[2]=100;
			}
			else if(a[1]!=-1&&a[2]==-1)
			{
				a[2]=a[1]; // a[2]尽量大 
					// 小于1的分数 分子分母同加一个数  值增大 !! 
			}
			else if(a[1]==-1)
			{
				a[1]=100;
			}
			sum+=a[1]+a[2];
			int d=gcd(a[1]+a[2],sum); //约分 
			
			cout<<(a[1]+a[2])/d<<'/'<<sum/d<<endl;
		} 
		return 0;
	} 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值