A题:A-Seventeen_“山大地纬杯”第十二届山东省ICPC大学生程序设计竞赛(正式赛) (nowcoder.com)
思路:看清题目要求,找规律即可 +分类讨论
AC代码:
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
if(n<=3)cout<<-1;
else if(n==4)cout<<"2+3*(4+1)";
else if(n==5)cout<<"3*5+(4-2)*1";
else if(n%2==0)
{
cout<<"2+3*(4+1)";
for(int i=6;i<=n;i+=2)
{
cout<<"*("<<i<<"-"<<i-1<<")";
}
}
else
{
cout<<"3*5+(4-2)*1";
for(int i=7;i<=n;i+=2)
{
cout<<"*("<<i<<"-"<<i-1<<")";
}
}
return 0;
}
H题:H-Counting_“山大地纬杯”第十二届山东省ICPC大学生程序设计竞赛(正式赛) (nowcoder.com)
思路:按题意模拟
AC代码:
#include<algorithm>
#include<iostream>
using namespace std;
#define ll long long
ll g[2005][2005];
ll p[3005][3005];
char mov[3005][3005];
ll n,m,k,t;
ll get(int x,int y)
{
return (x-1)*m+y;
}
ll f(ll x)
{
if(x>=2)return x*(x-1)/2;
else return 0;
}
ll getx(ll x)
{
if(x%m==0)return x/m;
else return x/m+1;
}
ll gety(ll y)
{
if(y%m==0)return m;
else return y%m;
}
int main()
{
cin>>n>>m>>k>>t;
ll w=0;
for(int i=1;i<=k;i++)
{
int x,y;
cin>>x>>y;
g[x][y]++;
p[i][0]=get(x,y);
}
for(int i=1;i<=k;i++)scanf("%s",mov[i]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
w+=f(g[i][j]);
}
}
cout<<w<<endl;
for(int i=1;i<=t;i++)
{
for(int j=1;j<=k;j++)
{
char mo=mov[j][i-1];
int x1,y1;
x1=getx(p[j][i-1]);
y1=gety(p[j][i-1]);
w-=f(g[x1][y1]);
if(g[x1][y1]!=0)g[x1][y1]--;
w+=f(g[x1][y1]);
if(mo=='L')y1--;
else if(mo=='R')y1++;
else if(mo=='U')x1--;
else x1++;
w-=f(g[x1][y1]);
g[x1][y1]++;
w+=f(g[x1][y1]);
p[j][i]=get(x1,y1);
}
cout<<w<<endl;
}
return 0;
}
E题:
思路:分类讨论+前缀积
AC代码:
#include<algorithm>
#include<iostream>
#include<map>
#include<cstring>
using namespace std;
#define ll long long
ll n,x;
ll a[500005];
ll res=0;
map<ll,int>m;
ll s[500005];
ll get(ll x)
{
return (x+x*(x-1)/2);
}
int main()
{
s[0]=1;
cin>>n>>x;
if(x==0)
{
ll cnt=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]!=0)
{
cnt++;
}
else
{
res+=get(cnt);
cnt=0;
}
}
res+=get(cnt);
res=get(n)-res;
}
else
{
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]!=0)
{
s[i]=s[i-1]*a[i];
s[i]%=998244353;
if(s[i]==x)res++;
res+=m[s[i]];
m[(s[i]*x)%998244353]++;
}
else
{
m.erase(m.begin(),m.end());
s[i]=1;
}
}
}
cout<<res;
return 0;
}
K题:
思路:按题意模拟+暴力
AC代码:
#include <iostream>
#include<algorithm>
using namespace std;
#define ll long long
int main()
{
int n;
cin>>n;
while(n--)
{
int x;
cin>>x;
if(x==0)
{
cout<<"both"<<endl;
}
else
{
int cnta=0;
int cntb=0;
int flag=0;
for(int i=x/19;i>=0;i--)
{
for(int j=(x%19)/17;j>=0;j--)
{
for(int k=((x%19)%17)/3;k>=0;k--)
{
if( (x-19*i-17*j-3*k)%2==0)
{
cnta=i+j+k+(x-19*i-17*j-3*k)/2;
flag=1;
break;
}
}
if(flag)break;
}
if(flag)break;
}
flag=0;
for(int i=x/13;i>=0;i--)
{
for(int j=(x%13)/11;j>=0;j--)
{
for(int k=((x%13)%11)/7;k>=0;k--)
{
if( (x-13*i-11*j-7*k)%5==0)
{
cntb=i+j+k+(x-13*i-11*j-7*k)/5;
flag=1;
break;
}
}
if(flag)break;
}
if(flag)break;
}
if(cnta==0&&cntb==0)cout<<"-1"<<endl;
else if(cnta==0&&cntb!=0)cout<<"B"<<endl;
else if(cnta!=0&&cntb==0)cout<<"A"<<endl;
else
{
if(cnta>cntb)cout<<"B"<<endl;
else if(cnta<cntb)cout<<"A"<<endl;
else cout<<"both"<<endl;
}
}
}
return 0;
}