250
简单题
// BEGIN CUT HERE
// END CUT HERE
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <utility>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <cstdlib>
#include <set>
#include <iterator>
#include <sstream>
#include <ctime>
using namespace std;
typedef long long LL;
#define sz(x) x.size()
#define pb push_back
#define mp make_pair
#define clr(x,a) memset(x,a,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(x))
class TwoWaysSorting {
public:
bool jud1(vector<string> &sl){
int sz=sl.size();
for(int i=1;i<sz;i++)
if(sl[i]<sl[i-1]) return false;
return true;
}
bool jud2(vector<string> &sl){
int sz=sl.size();
for(int i=1;i<sz;i++)
if(sl[i].length()<sl[i-1].length()) return false;
return true;
}
string sortingMethod(vector <string> stringList) {
bool lex=jud1(stringList);
bool len=jud2(stringList);
if(lex&&!len)
return "lexicographically";
if(!lex&&len)
return "lengths";
if(lex&&len)
return "both";
if(!lex&&!len)
return "none";
}
// BEGIN CUT HERE
// END CUT HERE
};
// BEGIN CUT HERE
// END CUT HERE
DP 背包
// BEGIN CUT HERE
// END CUT HERE
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <utility>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <cstdlib>
#include <set>
#include <iterator>
#include <sstream>
#include <ctime>
using namespace std;
typedef long long LL;
#define sz(x) x.size()
#define pb push_back
#define mp make_pair
#define clr(x,a) memset(x,a,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(x))
int dp[2000000+20];
class NumbersChallenge {
public:
int MinNumber(vector <int> S){
int sum=0;
clr(dp,0);
for(int i=0;i<sz(S);i++)
sum+=S[i];
dp[0]=1;
for(int i=0;i<sz(S);i++)
for(int v=sum;v>=S[i];v--){
if(!dp[v-S[i]])
continue;
dp[v]=1;
}
for(int i=1;i<=sum;i++)
if(!dp[i]) return i;
return sum+1;
}
// BEGIN CUT HERE
// END CUT HERE
};
// BEGIN CUT HERE
// END CUT HERE
1000
高斯消元求解一个向量空间中基的数量
题意大体是,一个数字代表一种颜色,任意两个颜色经过异或可以得到第三种颜色。
商店里可以买到所有的颜色。
现在给你了一个数组,要求我们能够得到里面所有的颜色。
问最少要买多少个不同的颜色可以得到我们所要求的所有颜色。
吧一个数字转化成一个31位的二进制数。
看作是矩阵中的一行。
接下来每一个数都如此处理。
构造一个矩阵。经过行列变换(模2运算,因为是异或),此处即用高斯消元法。最终得到的非零行的数量就是最少的颜色数,即一个向量空间中基的数量。
// BEGIN CUT HERE
// END CUT HERE
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <utility>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <cstdlib>
#include <set>
#include <iterator>
#include <sstream>
#include <ctime>
using namespace std;
typedef long long LL;
#define sz(x) x.size()
#define pb push_back
#define mp make_pair
#define clr(x,a) memset(x,a,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(x))
#define bit(x,i) ((1<<i)&x)
class MixingColors {
public:
int gauss(vector<int> &colors){
int n=sz(colors);
int r=0;
for(int i=0;i<31;i++){
for(int j=r;j<n;j++)
if(bit(colors[j],i)){
swap(colors[j],colors[r]);
break;
}
if(!bit(colors[r],i))
continue;
for(int j=r+1;j<n;j++)
if(bit(colors[j],i))
colors[j]=colors[j]^colors[r];
r++;
}
return r;
}
int minColors(vector <int> colors) {
return gauss(colors);
}
// BEGIN CUT HERE
// END CUT HERE
};
// BEGIN CUT HERE
// END CUT HERE