1.砝码称重


#include <iostream>
#include <vector>
using namespace std;
const int N=110;
const int M=100010;
int w[N];
int n;
int f[N][M];
int m;
int ans;
//f[i][j]表示到第i个砝码进行放置时的称得的重量为j的方案数
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>w[i];
m+=w[i];
}
f[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
f[i][j]=f[i-1][j]+f[i-1][j+w[i]]+f[i-1][abs(j-w[i])];
}
}
for(int j=1;j<=m;j++)
{
if(f[n][j])//有方案
{
ans++;
}
}
cout<<ans<<endl;
return 0;
}
2.直线

#include <iostream>
#include <map>
using namespace std;
struct node
{
double x,y;//使用double为了计算斜率和截距方便
}p[20*21+5];
map<pair<double,double>,int>mp;//判断是否已经有此直线了
int cnt;
int ans;
int main()
{
//20*21个整点即20行x19列
int row=21;//纵坐标0~20
int col=20;//横坐标0~19
for(int i=0;i<col;i++)
{
for(int j=0;j<row;j++)
{
p[cnt].x=i;
p[cnt].y=j;
cnt++;
}
}
ans=row+col;//初始为所有横线+竖线
for(int i=0;i<cnt;i++)//枚举所有两两点
{
for(int j=0;j<cnt;j++)
{
if(p[i].x==p[j].x||p[i].y==p[j].y)continue;//同一横和竖都不要
double k=(p[i].y-p[j].y)/(p[i].x-p[j].x);
double b=(p[i].x*p[j].y-p[j].x*p[i].y)/(p[i].x-p[j].x);
if(mp[{k,b}]==0)
{
mp[{k,b}]=1;
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
3.异或数列



#include <iostream>
#include <vector>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int res=0;
vector<int>v(32);
for(int i=0;i<n;i++)
{
int k;
cin>>k;
res^=k;
for(int j=0;j<32&&k;j++)
{
if(k&1)
{
v[j]++;
}
k>>=1;
}
}
if(res==0)
{
cout<<0<<endl;
continue;
}
for(int j=31;j>=0;j--)
{
if(v[j]%2==0)continue;
else
{
if(v[j]==1)
{
cout<<1<<endl;
break;
}
else
{
if(n%2==0)
{