A 简单DP
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 100005
int main()
{
long long n;
long long num[MAX], dp[MAX];
cin>>n;
for(int i=0; i<n; i++)
cin>>num[i];
dp[0]=num[0];
for(int i=1; i<n; i++)
{
dp[i]=num[i];
for(int j=0; j<i; j++)
{
if(dp[i]<(dp[j]^num[i]))
dp[i]=dp[j]^num[i];
}
}
sort(dp, dp+n);
int temp;
for(int i=n-1; i>=0; i--)
if(dp[i]!=dp[n-1])
{
temp = i;
break;
}
cout<<dp[n-1]<<" "<<dp[temp]<<endl;
}
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 100005
struct Node
{
int score;
int ID;
int th;
}node[MAX];
struct fr
{
int xi;
int yi;
}frie[1005];
struct Gift
{
int ki;
int ai;
int bi;
}gift[2];
bool Cmp(Node a, Node b)
{
return a.score>b.score;
}
int main()
{
int n;
int xi, yi;
int ki, ai, bi;
int visited[1005]={0};
cin>>n;
for(int i=0; i<n; i++)
{
cin>>frie[i].xi>>frie[i].yi;
}
for(int i=0; i<2; i++)
cin>>gift[i].ki>>gift[i].ai>>gift[i].bi;
int k=0;
for(int i=0; i<2; i++)
for(int j=0; j<n; j++)
{
node[k].score=gift[i].ai*frie[j].xi+gift[i].bi*frie[j].yi;
node[k].ID=j;
node[k].th = i;
k++;
}
sort(node, node+2*n, Cmp);
int temp = n;
int sum =0 ;
for(int i=0; i<2*n&&temp>0; i++)
{
if( gift[node[i].th].ki>0 &&!visited[node[i].ID])
{
sum+=node[i].score;
visited[node[i].ID]=1;
gift[node[i].th].ki--;
temp--;
}
}
cout<<sum<<endl;
}