マスク生産


マスク生産
  • 題目説明問題説明周知のように、マスクは2020年の熱い年物であり、あなたが反応したときにマスクはすでに品切れになった.この時、あなたの家はマスクをしていない人は外出してはいけないと規定しています.生活必需品を購入するためには、コミュニティのおばさんの検査に合格するマスクを自分で工夫しなければなりません.1、合格のマスクを作るには、不織布a枚、ナイロンロープb本、マスクのコアであるc枚の溶射布が必要であることが知られている.2、この时、あなたの手にはちょうどn枚の不織布、m本のナイロンロープ、r枚の溶噴布があります.3、あなたの手にはpグラムの3つの物品を作る原料であるポリプロピレンがあるので、x、y、zグラムのポリプロピレンをそれぞれ消費して不織布、ナイロンロープ、溶噴布を作ることができます.すみません、マスクは最大何個作れますか?データ入力は4行あり、そのうち、1行目に3つの整数a、b、cがあり、マスク製作に必要な不織布、ナイロンロープとメルトスプレー布の数を示す2行目に3つの整数n、m、rがあり、あなたの既存の不織布、ナイロンロープとメルトスプレー布の数を示す3行目に1つの整数pがあり、あなたの既存のポリプロピレンの重量の総和(単位:グラム)の4行目に3つの整数x、y、zがあり、不織布、ナイロンロープとメルトスプレー布を作るのに必要なポリプロピレンの重量(単位:グラム)のデータを出力して整数を出力し、あなたが作ることができる合格マスクの数を示します.入力例3 2 6 4 1 4 1 2 3出力例2データ範囲1、0≦a、b、c≦100であり、0
  • 最初の分析はcsdnの大物の1つのやり方を参考にします:ロシアのブロックのように、(バケツの短い板)、先に消して、ポリプロピレンは先に最も短い板の原材料に変換します.参照説明:
  • 川の真ん中から来た人
    おもちゃを組み立てる(欲張る)
  • 第1回コード
  • #include
    #include
    #include
    using namespace std;
    typedef long long ll;
    const int N = 4;
    struct node 
    {
    	ll x;
    	ll y;
    	ll z;
    	ll m;
    } ;
    int cmp(node a, node b)
    {
    	return (a.m < b.m);
    }
    void judge(ll p,int n);
    node a[N]; 
    int main()
    {
    	int p;
    	int num=0;    //  0   
    	for (int i = 1; i <=3; i++) 
    	{
    		cin >> a[i].x;
    		if (a[i].x!=0)
    		num++;
    	}
    	for (int i = 1; i <=3; i++) 
    	{
    		cin >> a[i].y;
    		if (a[i].x!=0)
    		a[i].m = llabs(a[i].y / a[i].x);
    		//cout<
    		
    	}
    	cin>>p;
    	for (int i = 1; i <=3; i++) 
    	{
    		cin >> a[i].z;
    	}
    	if(num<3)
    	{
    		node X[num+1];
    		int j=1;
    		for(int i=1;i<=3;i++)
    		{
    		
    			if(a[i].x!=0)
    			{
    				X[j].x=a[i].x;
    				X[j].y=a[i].y;
    				X[j].z=a[i].z;
    				X[j++].m=a[i].m;
    				
    			}
    			
    		}
    		for(int i=1;i<=num;i++)
    		{
    		a[i].x=X[i].x;
    		//cout<
    		a[i].y=X[i].y;
    		a[i].z=X[i].z;
    		a[i].m=X[i].m;
    		//cout<
    		}
    		sort(a+1, a + num+1, cmp);
    		judge(p,num);
    		ll ans=a[1].m ;
    		for (int i = 1; i <= num; i++)
    		{
    			ans = min(ans, a[i].m);
    		}
    		cout << ans << endl;
    		return 0;	
    	}
    	sort(a+1, a + 4, cmp);//          
    	judge(p,3);
    	ll ans=a[1].m ;
    	for (int i = 1; i <= 3; i++)
    		{
    			ans = min(ans, a[i].m);
    		}
    	cout << ans << endl;
    	return 0;
    			
    }
    
    void judge(ll p,int n)
    {
    	int ok = 1;
    	while (p > 0 && ok)
    	{
    		int mod = 0;
    		for (int i = 1; i <= n; i++) 
    		{
    			
    			cout <<"i="<<i<<endl;
    			if (i > 1 && a[i].m != a[i - 1].m - 1) break;//           ,       。 
    			mod += a[i].y % a[i].x;
    			//cout<
    			ll need = a[i].x - (a[i].y % a[i].x);//       
    			//cout<
    			if (p >= need*a[i].z) 
    			{
    				a[i].y += need;
    				a[i].m++; 
    				//cout<
    				p -= need*a[i].z;      //       
    				//cout<
    			}
    			else 
    			{
    				ok = 0;            //                  
    				break;
    			}
    		}
    	}
    }
    
    

    説明:もちろん結果はいくつかのデータが過ぎないで、ははは
  • の2回目の分析で、ある大物に聞いてみると、突然この問題が逆に考えることができることが分かった.まず、既存の材料をマスクに生産し、ポリプロピレンで補うのが足りず、残りのポリプロピレンを直接マスクに生産すると、この問題は簡単に明らかになった.
  • 第2次コード
  • #include
    #include
    #include
    using namespace std;
    typedef long long ll;
    const int N = 4;
    ll sum1=0,sum2 =0,sum0=0;
    struct node 
    {
    	ll x;   
    	ll y;
    	ll z;
    	ll m;
    } a[N];
    ll Max;
    ll Min;
    int main()
    {
    	ll p;
    	for (int i = 1; i <=3; i++) 
    	{
    		cin >> a[i].x;    
    	}
    	for (int i = 1; i <=3; i++) 
    	{
    		cin >> a[i].y;    
    	}
    	cin>>p;                      
    	for (int i = 1; i <=3; i++) 
    	{
    		cin >> a[i].z;           
    		if(a[i].x!=0)
    		{
                sum1+=a[i].x*a[i].z;
    			a[i].m = a[i].y/a[i].x;
    		}
    	}
    	int i ;
    	for( i =1 ;i<N;i++)
    	{
    		if(a[i].x!=0)
    		{
    			Min = Max = a[i].m;
    			break;
    		}
    	}
    	for(++i;i<N;i++)
    	{
    		if(a[i].x!=0)
    		{
    			Min = min(Min,a[i].m);
    			Max = max(Max,a[i].m);
    		}
    	}
    	for(i = 1;i<N;i++)
    	{
    		if(a[i].x!=0)
    		sum0+=(Max*a[i].x-a[i].y)*a[i].z;
    	}
    	if(p<sum0)
    	{
    		cout<<Min<<endl;
    		return 0;
    	}
    	else 
    	{
    		p = p-sum0;
    		ll ans;
    		ans=p/sum1 +Max;
    		cout<<ans<<endl;
    		return 0;
    	}
    }
    
    

    初心者、スプレーしないでください.