A-Seventeen
队里天才少女妙计过题,我们找到了最小的可以构造出17的答案是偶数4 ( (1+4)*3+2)和奇数5
(3+4+2*5*1),对于其他的数只需区分奇数偶数,在4和5的基础上把后面的数字按顺序两两一组,然后让每组中较大的一个减去较小的一个,得到的结果是1,然后用乘法乘起来即可。
例如 10 (1+4)*3 +2 *(6-5)*(8-7)*(10-9) 11 3+4+2*5*1 *(7-6)*(9-8)*(11-10)
#include <iostream>
#include<algorithm>
#include<cstring>
#define sc(n) scanf("%d", &n)
const int N=1e5+10;
#define int long long
#define endl '\n'
#define FAST ios::sync_with_stdio(false);
using namespace std;
signed main()
{
FAST;
int n;
cin>>n;
if(n<4)cout<<"-1"<<endl;
if(n==4)cout<<"(1+4)*3+2"<<endl;
else if(n==5)cout<<"3+4+2*5*1"<<endl;
else if(n>5&&n%2==0)
{
cout<<"(1+4)*3+2";
for(int i=5;i<=n;i+=2)
{
cout<<"*("<<i+1<<"-"<<i<<")";
}
cout<<endl;
}
else if(n>5&&n%2!=0)
{
cout<<"3+4+2*5*1";
for(int i=6;i<=n;i+=2)
{
cout<<"*("<<i+1<<"-"<<i<<")";
}
cout<<endl;
}
return 0;
}
H-count
题目不难,模拟一下即可。
#include <iostream>
#include<algorithm>
#include<cstring>
const int N=2e3+10;
#define endl '\n'
using namespace std;
int mp[N][N],x[N],y[N];
char s[N][3010];
signed main()
{
FAST;
int n,m,k,t;
scanf("%d%d%d%d",&n,&m,&k,&t);
for(int i=1;i<=k;i++)scanf("%d%d",&x[i],&y[i]);
for(int i=1;i<=k;i++)scanf("%s",s[i]);
for(int i=0;i<=t;i++)
{
int ans=0;
for(int j=1;j<=k;j++)
{
ans+=mp[x[j]][y[j]];
mp[x[j]][y[j]]++;
}
printf("%d\n",ans);
for(int j=1;j<=k;j++)
{
mp[x[j]][y[j]]=0;
if(s[j][i]=='U')x[j]--;
if(s[j][i]=='D')x[j]++;
if(s[j][i]=='L')y[j]--;
if(s[j][i]=='R')y[j]++;
}
}
return 0;
}
K-coins
因为17 19互质,所以包含有17,19的数组可以表示17*19=288之后的所有的数字,因为a数组的最大值19要大于b数组的最大值13,所以在288之后的所有数字用第一个数组来表示所需要的数字个数一定小于第二个数组。
小于2的数特判为结果为-1,288以内的数字用完全背包得到所需数字个数,比较后得出结果即可。
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int f1[N],f2[N];
const int dx[]={2,3,17,19},dy[]={5,7,11,13};
int main()
{
memset (f1,0x3f,sizeof(f1));
memset (f2,0x3f,sizeof(f2));
f1[0]=f2[0]=0;
for(int i=0;i<4;i++)
{
for(int j=dx[i];j<=288;j++)
f1[j]=min(f1[j-dx[i]]+1,f1[j]);
for(int j=dx[i];j<=288;j++)
f2[j]=min(f2[j-dy[i]]+1,f2[j]);
}
int T;scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
cout<<f1[n]<<" "<<f2[n]<<endl;
if(n>=288)puts("A");
if(n<2)puts("-1");
else if(f1[n]==f2[n])puts("both");
else if(f1[n]<f2[n])puts("A");
else if(f1[n]>f2[n])puts("B");
}
return 0;
}
E-Subsegments
此类子串和,子串积问题有基本通用解法,一是用map映射+前缀积,由当前前缀和作为逆元找到sum*k存入map,遍历到已有sum值就加入ans值。另外注意特判一下k=0。二是用滑动窗口。
#include <bits/stdc++.h>
#define sc(n) scanf("%d", &n)
const int N = 5e5 + 10;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define FAST ios::sync_with_stdio(false);
using namespace std;
unordered_map<int, int> mp;
int a[N];
void solve()
{
int n,m,ans=0;
cin >> n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
if(m==0)
{
int pos=0;
for(int i=1;i<=n;i++)
if(a[i]==0){
ans+=(i-pos)*(n-i+1);
pos=i;
}
cout<<ans<<endl;
return ;
}
int mul=1;mp[m]++;
for(int i=1;i<=n;i++)
{
mul=(mul*a[i])%mod;
if(mul==0){
mul=1;mp.clear(),mp[m]++;
continue;
}
if(mp.count(mul))ans+=mp[mul];
mp[mul*m%mod]++;
}
cout<<ans<<endl;
}
signed main()
{
FAST;
int _;
// cin >> _;
_ = 1;
while (_--)
solve();
return 0;
}
H-Football Match
计算几何,2022/6/3 先鸽一发,把内积叉积绕点旋转学会再回来补。