第一题“打扑克”:纯模拟(10分)
输入输出样例如下:
AC_code如下:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=3e5+10;
typedef long long LL;
typedef pair<int,int> PII;
int e[M],w[M],ne[M],h[N],idx;
int dist[N];
bool vis[N];
int cnt[N];
struct f {
int num,id;
}s[N];
bool cmp(struct f x,struct f y) {
if(x.id==y.id) return x.num<y.num;
return x.id<y.id;
}
map<PII,int>mp;
int main()
{
int cnt=0;
for(int i=1; i<=27; i++)
{
int a,b;
cin >> a >> b;
if(a==14)
{
int aa = 1;
if(!mp[{
aa,b}]) s[++cnt]={
aa,b},mp[{
aa,b}]=1;
}
if(mp[{
a,b}]) continue;
mp[{
a,b}] = 1;
s[++cnt] = {
a,b};
}
//cout<<endl;
sort(s+1,s+cnt+1,cmp);
int ans=0;
//for(int i=1;i<=cnt;i++)
//cout<<s[i].num<<" "<<s[i].id<<endl;
for(int i=1; i<=cnt; i++)
{
//if(s[i].num>=11) break;
int flag=0;
if(i+4>cnt) continue;
for(int j=i+1; j<=i+4; j++)
if(s[j].id!=s[i].id||s[j].num!=s[i].num+j-i||s[j].num>14)
flag=1;
if(!flag) ans++;
}
cout << ans << endl;
return 0;
}
第二题“钱老板玩MMO”:纯模拟(20分)
输入输出样例如下:
AC_code如下:
#include <bits/stdc++.h>
using namespace std;
const int N=4e5+10;
typedef long long LL;
typedef pair<LL,LL> PLL;
int n,m;
struct f {
int x,y;
}s[N];
int check1(int u)
{
int cnt1=0,cnt2=0,cnt3=0,cnt4=0;
for(int i=1; i<=m; i++)
{
if(s[i].x==s[u].x) cnt1++;
if(s[i].y==s[u].y) cnt2++;
if(s[i].x-s[u].x==s[i].y-s[u].y) cnt3++;
if(s[u].x-s[i].x==s[i].y-s[u].y) cnt4++;
}
int res;
res=max(cnt1,cnt2);
res=max(res,cnt3);
res=max(res,cnt4);
//cout<<cnt1<<" "<<cnt2<<" "<<cnt3<<" "<<cnt4<<endl;
return res;
}
int check2(int u)
{
int cnt=0;
int lx=s[u].x-n,rx=s[u].x+n,ly=s[u].y-n,ry=s[u].y+n;
for(int i=1; i<=m; i++)
if(s[i].x<=rx&&s[i].x>=lx&&s[i].y<=ry&&s[i].y>=ly)
cnt++;
return cnt;
}
int main()
{
cin >> n >> m;
for(int i=1; i<=m; i++)
{
int a,b;
cin >> a >> b;
s[i]={
a,b};
}
int ans=0;
for(int i=1; i<=m; i++)
{
int t = max(check1(i),check2(i));
ans = max(ans,t);
}
cout << ans << endl;
return 0;
}
第三题“接水果”:DP(30分)
输入输出样例如下:
Tips:这题有一个限制,就是x和y组合起来的范围很大,需要建个图。建图可以少去很多无用转移。
AC_code如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=10050;
const int maxm=105;
struct point{
int x,y,val;
point(int x=0,int y=0,int val=0):x(x),y(y),val(val){
}
};
bool operator < (point a,point b){
return a.y<b.y||(a.y==b.y&&a.x<b.x);
}
point p[maxn];
int dp[maxn][maxm];
int v,x0,n,m;
void solve() {
scanf("%d %d %d %d",&v,&x0,&n,&m);
for(int i=1; i<=n; i++)
scanf("%d %d %d",&p[i].x,&p[i].y,&p[i].val);
sort(p+1,p+n+1);
p[0] = point(x0,0,0);
int res=0;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m&&i-j>=0; j++) {
for(int k=j-1; k<=m-1; k++) {
int h = p[i].y-p[i-j].y;
int l = p[i-j].x-h*v,r=p[i-j].x+h*v;
if(p[i].x>=l&&p[i].x<=r)
dp[i][k] = max(dp[i][k],dp[i-j][k-(j-1)]+p[i].val);
}
}
for(int j=0; j<=m-1; j++)
res = max(res,dp[i][j]);
}
printf("%d\n",res);
}
int main()
{
solve();
return 0;
}
第四题“可视化编程”:猜测是处理出所有开关的状态然后暴力(40分)