2022“山大地纬杯”第十二届山东省ICPC大学生程序设计竞赛

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 
#include
#include
#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"<5&&n%2==0)
    {
        cout<<"(1+4)*3+2";
        for(int i=5;i<=n;i+=2)
        {
            cout<<"*("<5&&n%2!=0)
    {
        cout<<"3+4+2*5*1";
        for(int i=6;i<=n;i+=2)
        {
            cout<<"*("<

H-count

题目不难,模拟一下即可。

#include 
#include
#include
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 
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<=288)puts("A");
        if(n<2)puts("-1");
        else if(f1[n]==f2[n])puts("both");
        else if(f1[n]f2[n])puts("B");
    }

	return 0;
}

E-Subsegments

此类子串和,子串积问题有基本通用解法,一是用map映射+前缀积,由当前前缀和作为逆元找到sum*k存入map,遍历到已有sum值就加入ans值。另外注意特判一下k=0。二是用滑动窗口。

#include 
#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 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<> _;
    _ = 1;
    while (_--)
        solve();
    return 0;
}

H-Football Match

计算几何,2022/6/3 先鸽一发,把内积叉积绕点旋转学会再回来补。

你可能感兴趣的:(比赛补题+记录,c++,算法,几何学)