2 条题解

  • 2
    @ 2024-10-23 20:41:52
    using namespace std;
    long long n,_1,_2,_3,_4,mi=LONG_MAX;
    int main(){
    //	freopen("jie.in","r",stdin);
    //	freopen("jie.out","w",stdout);
    	cin>>n;
    	for(long long a=1;a<=n;++a){
    		long long b=(n-a*3)/4;
    		long long c=a+b;
    		long long d=c+b;
    		if(abs(a+b+c+d-n)<mi&&a<b){
    			mi=abs(a+b+c+d-n);
    			_1=a;
    			_2=b;
    			_3=c;
    			_4=d;
    			if(mi==0){
    				cout<<_1<<" "<<_2<<" "<<_3<<" "<<_4;
    				return 0;
    			}
    		}
    	}cout<<_1<<" "<<_2<<" "<<_3<<" "<<_4;
    }
    
    
    • 1
      @ 2024-10-23 20:11:19

      其实可以很容易推出: a+b+c+d=a+b+(a+b)+(b+(a+b))a+b+c+d=a+b+(a+b)+(b+(a+b))

      =3a+4b=3a+4b

      然后就可以写出一个暴力枚举的On2代码:

      // O(n^2) 暴力枚举
      #include <bits/stdc++.h>
      #define int long long
      using namespace std;
      int n;
      int a, b;
      signed main()
      {
          freopen("jie.in", "r", stdin);
          freopen("jie.out", "w", stdout);
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin >> n;
          a = 1, b = 2;
          for (int i = 1; i <= n; i++)
              for (int j = i + 1; j <= n; j++)
                  if (abs(n - 3 * i - 4 * j) < abs(n - 3 * a - 4 * b))
                      a = i, b = j;
          cout << a << " " << b << " " << a + b << " " << a + 2 * b << "\n";
          return 0;
      }
      

      30分到手了

      一种是修改上面的代码套一层 for 循环枚举11001∼100 的结果,容易发现 aa 必然是14 1∼4 中的一个,此时就可以写出来 O(n)O(n) 的代码了, 然后进一步如果能推出 b 是大于 a 且最接近(n3a)/4 (n−3a)/4,就能 O(1)O(1) 做了 ​

    • 1

    信息

    ID
    1051
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    38
    已通过
    4
    上传者