生活随笔
收集整理的這篇文章主要介紹了
你真的会暴力吗
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4441
題解:
首先題目中要求兩個不相交的子序列數值和相等,可以等價于任意兩個子序列數值和不相等。
然后可以發現他不同的子序列一共有2n 種,但是子序列的最大值為n*max(ai);
那么根據鴿巢原理可以得出來當n 大于21 的時候肯定不是一個完美序列。
對于剩下的數列可以進行暴力。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
char fre[10] = "data1.in";
char fot[10] = "data1.out";int vis[N * 20];
//int bb[N * 20];
int v[N], teb;
void solve(){int t;scanf("%d", &t);while(t--){teb++;int n;scanf("%d", &n);for(int i = 0; i < n; ++i) scanf("%d", &v[i]);if(n > 21) puts("no");else{bool flag = true;for(int gg = 1, now = 0; gg < (1 << n) && flag; ++gg){now = 0;for(int i = 0; i < n; ++i) if((gg >> i) & 1) now += v[i];if(vis[now] == teb){flag = false;
// cout << now << " " << gg << " " << bb[now] << endl;}vis[now] = teb;
// bb[now] = gg;}flag ? puts("yes") : puts("no");}}
}
int main()
{solve();
// int T = 3;
// for(int cas = 1; cas <= T; ++cas){
// fre[4] = ('0' + cas);
// fot[4] = ('0' + cas);
// freopen(fre, "r", stdin);
// freopen(fot, "w", stdout);
// solve();
// }return 0;
}
?
總結
以上是生活随笔為你收集整理的你真的会暴力吗的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。