zoukankan      html  css  js  c++  java
  • 题解 P2036 【Perket】

    这道题因为数据小(1≤N≤10),所以可以用一种叫 二进制模拟(Maybe,也许吧,本蒟蒻不记得了)的方法。

    至于具体操作嘛,上图(这里以样例二来模拟)

    1 2 3 4
    0 0 0 0

    第一排是调料序号,第二排是是否选取(1是选,0是不选)。

    1 2 3 4
    1 0 0 0

    f[0]++;

    多一位

    这时,差为7-1=6

    ans=6。

    1 2 3 4
    0 1 0 0

    现在是6-2=4。

    ans=4。

    1 2 3 4
    1 1 0 0

    现在是7+6-1×2=11.

    ans=4.

    1 2 3 4
    0 0 1 0

    现在是8-3=5

    ans=4。

    …………

    就这样每次在第一位加一,再/2%2。

    就是0,1,10,11,100,101,110,111,1000……这样的二进制序列,化成十进制就是1,2,3,4,5,6,7,8……

    那么,上代码!

    #include<bits/stdc++.h>//万能头文件,NOIP建议不要用
    using namespace std;
    int main()
    {
    	int n,t[20],s[20],ans=2100000000;
    	int f[20];
    	memset(f,0,sizeof(f));//初始化
    	cin>>n;
    	for(int i=0;i<n;i++) cin>>s[i]>>t[i];
    	while(1)//开始模拟
    	{
    		f[0]++;//最后一位加一
    		for(int i=0;i<n;i++)//依次处理
    		{
    			f[i+1]+=f[i]/2;
    			f[i]%=2; 
    		}
    		if(f[n]) break;//退出条件
    		int p=0,q=1;//进行选取
    		for(int i=0;i<n;i++)
    		if(f[i])	
    		{
    			q*=s[i];
    			p+=t[i];
    		}
    		if(abs(p-q)<ans)
            	ans=abs(p-q);//更新最小值
    	}
    	cout<<ans;
    	return 0;
    }
    

    886~

  • 相关阅读:
    终于清楚了!!!【使用jenkins发布应用到tomcat详细过程】
    RocketMQ相关问题
    关于idea修改当前使用的git账户的问题
    Elasticsearchan安装初尝01-问题记录
    Redis学习日记-03
    Git初探笔记02
    Git初探笔记01
    Redis学习日记-02
    HDU 1017
    HDU 1013
  • 原文地址:https://www.cnblogs.com/oierscw/p/12542331.html
Copyright © 2011-2022 走看看