A 幸运数
普通模拟
B 有奖问答
普通爆搜
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
#define INF 0x3f3f3f3f
const int N=2e5+10;
int ans=0;
void dfs(int grade,int index)
{
if(grade==70) ans++;
if(grade==100) return;
if(index==31) return;
dfs(grade+10,index+1);
dfs(0,index+1);
}
void solve()
{
dfs(1,0);
return;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
}
有空补一下dp的题解
C 平方差
考察:数论
先列出一些,可以猜测规律:可以被平方差表示的数 “是奇数” 或 “因子有4”。
后续证明验证确实是这样
代码直接可以写了,不过1e9的数据会超时,只能过92%
优化
先求 L 到R的偶数个数,再求L到R的4的倍数
这样就从O(n)的时间复杂度减小为O(1);
ac code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
#define INF 0x3f3f3f3f
const int N=2e5+10;
void solve()
{
int l,r;
cin>>l>>r;
int a=r/2-(l-1)/2; //偶数个数
int b=r/4-(l-1)/4; //4的倍数
int cnt=a-b;
int ans=r-(l-1)-cnt;
cout<<ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
}
D 更小的数
思路:往后找 比当前位小的数 的个数
如果相等就继续比较
AC code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
string s;
int res=0;
void solve()
{
cin>>s;
for(int i=0;i<s.size();i++)
{
for(int j=i+1;j<s.size();j++)
{
if(s[i]>s[j]) res++;
else if(s[i]==s[j])
{
int l=i+1;
int r=j-1;
while(s[l]==s[r]&&l<r)
{
l++;
r--;
}
if(s[l]>s[r]) res++;
}
}
}
cout<<res<<endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
}
E 颜色平衡树
F 买瓜
考察:dfs、剪枝
AC code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
#define INF 0x3f3f3f3f
const int N=100;
double v[N];
double s[N];
int n,m,ans=INF;
void dfs(double sum,int res,int index) //sum当前瓜质量,res砍了几刀,index序号
{
if(sum==m)
{
ans=min(ans,res);
return;
}
if(index>n) return;
if(res>=ans) return;
if(sum>m) return;
if(sum+s[index]<m) return;
dfs(sum+v[index],res,index+1);
dfs(sum+v[index]/2.0,res+1,index+1);
dfs(sum,res,index+1);
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i];
sort(v+1,v+1+n,[&](double x,double y){return x>y;});
for(int i=n;i>=1;i--)
{
s[i]=s[i+1]+v[i];
}
dfs(0.0,0,1);
if(ans==INF) cout<<-1<<endl;
else cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
}
G 网络稳定性
H 异或和之和
先试了试只有前缀和的做法,过了62%
这先要了解关于前缀异或和的前置知识:
62 % code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
const int N=1e5+10;
int n,sum=0;
int s[N],a[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[i]=s[i-1]^a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
sum+=s[i-1]^s[j];
}
}
cout<<sum<<endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
}
优化:贡献法
ac code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
#define INF 0x3f3f3f3f
const int N=1e5+10;
void solve()
{
int n,ans=0;
cin>>n;
vector<int>a(n);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=20;i>=0;i--) //枚举每一位
{
int s=0,even=1,odd=0;
//记录第i位时到第j个数有s个1,even个偶数,odd个奇数
for(int j=0;j<n;j++)
{
int bit=(a[j]>>i)&1;
s+=bit;
//差分
if(s%2) //是奇数
{
ans+=even*(1<<i);
//奇-偶=奇 (奇个1异或和是1)
odd++;
}
else
{
ans+=odd*(1<<i);
//偶-奇=奇 (奇个1异或和是1)
even++;
}
}
}
cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
}
有一道很相似的类运算题,不过是与运算
I 像素放置
dfs
J 翻转硬币