第22次CCF-CSP计算机软件能力认证部分题解

T1 灰度直方图【100分】

无脑暴力

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <cmath>
#include <cctype>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))
#define CASET int _;scanf("%d",&_); for(int kase=1;kase<=_;kase++) 

typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair<int,int> PII;

static const int INF=0x3f3f3f3f;
static const ll INFL=0x3f3f3f3f3f3f3f3f;
static const db PI=acos(-1.0);
static const db EPS=1e-8;

inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0' || ch>'9'){ if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0' && ch<='9'){ X=(X<<1)+(X<<3)+ch-'0'; ch=getchar(); }
	if(flag) return X;
	return ~(X-1);
}

inline void write(int X)
{
	if(X<0) { X=~(X-1); putchar('-'); }
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
static const int MAXN=500+10;
int cnt[MAXN];
int n,m,l;
int main()
{
	int n=read(),m=read(),l=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			int x=read();
			cnt[x]++;
		}
	for(int i=0;i<l;i++)
		printf("%d ",cnt[i]);
	return 0;
}
T2 灰度直方图【100分】

二维前缀和

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <cmath>
#include <cctype>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))
#define CASET int _;scanf("%d",&_); for(int kase=1;kase<=_;kase++) 

typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair<int,int> PII;

static const int INF=0x3f3f3f3f;
static const ll INFL=0x3f3f3f3f3f3f3f3f;
static const db PI=acos(-1.0);
static const db EPS=1e-8;

inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0' || ch>'9'){ if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0' && ch<='9'){ X=(X<<1)+(X<<3)+ch-'0'; ch=getchar(); }
	if(flag) return X;
	return ~(X-1);
}

inline void write(int X)
{
	if(X<0) { X=~(X-1); putchar('-'); }
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
static const int MAXN=600+10;
int g[MAXN][MAXN],sum[MAXN][MAXN];
int n,l,R,t;
int main()
{
	n=read(),l=read(),R=read(),t=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			g[i][j]=read();
			sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+g[i][j];
		}
	int ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			int u=max(i-R,1),d=min(i+R,n);
			int l=max(j-R,1),r=min(j+R,n);
			if(sum[d][r]-sum[d][l-1]-sum[u-1][r]+sum[u-1][l-1]<=(d-u+1)*(r-l+1)*t) ans++;
		}
	printf("%d\n",ans);
	return 0;
}
T3 灰度直方图【100分】

直接模拟,题目说啥就干啥

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <cmath>
#include <cctype>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))
#define CASET int _;scanf("%d",&_); for(int kase=1;kase<=_;kase++) 

typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair<int,int> PII;

static const int INF=0x3f3f3f3f;
static const ll INFL=0x3f3f3f3f3f3f3f3f;
static const db PI=acos(-1.0);
static const db EPS=1e-8;

inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0' || ch>'9'){ if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0' && ch<='9'){ X=(X<<1)+(X<<3)+ch-'0'; ch=getchar(); }
	if(flag) return X;
	return ~(X-1);
}

inline void write(int X)
{
	if(X<0) { X=~(X-1); putchar('-'); }
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
static const int MAXN=1e4+10;
int N,Tdef,Tmax,Tmin; // N地址池大小 Tdef默认时间 Tmax最大时间 Tmin最小时间 
string H; // 主机名称 
struct IP{
	int guoqiTime;
	int state; //1未分配 2待分配 3占用 4过期 
	string zhujiname;
}ippool[MAXN];
int main()
{
//	freopen("1.out","w",stdout);
	cin>>N>>Tdef>>Tmax>>Tmin>>H;
	for(int i=1;i<=N;i++) ippool[i].state=1;
	CASET{
		int ti;
		string send,rece,type;
		int ip,time;
		cin>>ti>>send>>rece>>type>>ip>>time;
//		cout<<ti<<send<<rece<<type<<ip<<time<<endl;
		for(int i=1;i<=N;i++)
		{
			if(ippool[i].state==2 && ippool[i].guoqiTime<=ti)
			{
				ippool[i].state=1;
				ippool[i].zhujiname="";
				ippool[i].guoqiTime=0;
			}
			else if(ippool[i].state==3 && ippool[i].guoqiTime<=ti)
			{
				ippool[i].state=4;
				ippool[i].guoqiTime=0;
			}
		}
		if(rece==H || rece=="*" || type=="REQ")
		{
			if(type!="DIS" && type!="REQ") continue;
			if(rece=="*" && type!="DIS" || rece==H && type=="DIS") continue;
			if(type=="DIS")
			{
				int select=-1;
				for(int i=1;i<=N;i++)
					if(ippool[i].state!=1 && ippool[i].zhujiname==send)
					{
						select=i;
						break;
					}
				if(select==-1)
				{
					for(int i=1;i<=N;i++)
						if(ippool[i].state==1)
						{
							select=i;
							break;
						}
				}
				if(select==-1)
				{
					for(int i=1;i<=N;i++)
						if(ippool[i].state==4)
						{
							select=i;
							break;
						}
				}
				if(select==-1) continue;
				
				ippool[select].state=2;
				ippool[select].zhujiname=send;
				
				if(time==0) ippool[select].guoqiTime=ti+Tdef;
				else if(Tmin<=time-ti && time-ti<=Tmax) ippool[select].guoqiTime=time;
				else if(time-ti<Tmin) ippool[select].guoqiTime=ti+Tmin;
				else if(time-ti>Tmax) ippool[select].guoqiTime=ti+Tmax;
				cout<<H<<" "<<send<<" OFR "<<select<<" "<<ippool[select].guoqiTime<<endl;
			}
			else if(type=="REQ")
			{
				if(rece!=H)
				{
					for(int i=1;i<=N;i++)
						if(ippool[i].zhujiname==send && ippool[i].state==2)
						{
							ippool[i].state=1;
							ippool[i].zhujiname="";
							ippool[i].guoqiTime=0;
						}
					continue;
				}
				if(1<=ip && ip<=N && ippool[ip].zhujiname==send)
				{
					ippool[ip].state=3;
					if(time==0) ippool[ip].guoqiTime=ti+Tdef;
					else if(Tmin<=time-ti && time-ti<=Tmax) ippool[ip].guoqiTime=time;
					else ifme-ti<Tmin) ippool[ip].guoqiTime=ti+Tmin;
					else if(time-ti>Tmax) ippool[ip].guoqiTime=ti+Tmax;
					cout<<H<<" "<<send<<" ACK "<<ip<<" "<<ippool[ip].guoqiTime<<endl;
				}
				else cout<<H<<" "<<send<<" NAK "<<ip<<" 0"<<endl;
			}
		}
	}
	return 0;
}
T4 灰度直方图【100分】

区间dp,按理说复杂度似乎有问题,可能数据水了,有更优做法,过了懒得改

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <cmath>
#include <cctype>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))
#define CASET int _;scanf("%d",&_); for(int kase=1;kase<=_;kase++) 

typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair<int,int> PII;

static const int INF=0x3f3f3f3f;
static const ll INFL=0x3f3f3f3f3f3f3f3f;
static const db PI=acos(-1.0);
static const db EPS=1e-8;
static const int MOD=1e9+7;

inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0' || ch>'9'){ if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0' && ch<='9'){ X=(X<<1)+(X<<3)+ch-'0'; ch=getchar(); }
	if(flag) return X;
	return ~(X-1);
}

inline void write(int X)
{
	if(X<0) { X=~(X-1); putchar('-'); }
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
static const int MAXN=1000+10;
static const int MAXL=100000+10;
ll d[MAXN][MAXN],dp[MAXN][MAXN];
int n;
int vis[MAXL];
int a[MAXN];
int ma;
ll dfs(int l,int r)
{
	if(dp[l][r]!=-1) return dp[l][r];
	dp[l][r]=d[l][r]%MOD;
	for(int i=l+1;i<r;i++)
		dp[l][r]=(dp[l][r]+d[l][i]*dfs(i,r))%MOD;
	return dp[l][r];
}
int main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read(); vis[a[i]]=i;
		ma=max(ma,a[i]);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=ma;j++)
		{
			int t=a[i]+j;
//			printf("%d %d %d\n",i,j,t);
			if(vis[t]) continue;
			while(t+j<=ma)
			{
				if(vis[t+j])
				{
//					printf("%d %d\n",i,vis[t+j]);
					d[i][vis[t+j]]++;
					break;
				}
				t+=j;
			}
		}
	} 
//	for(int i=1;i<=n;i++) dp[i][i]=1;
//	for(int i=1;i<=n;i++)
//		for(int j=i+1;j<=n;j++)
//			printf("%d %d %d\n",i,j,d[i][j]);
	memset(dp,-1,sizeof(dp));
	printf("%lld\n",dfs(1,n));
	return 0;
}
T5 灰度直方图【80分】

无脑按时间暴力,这能给80也挺离谱的

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <cmath>
#include <cctype>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define lowbit(x) (x&(-x))
#define CASET int _;scanf("%d",&_); for(int kase=1;kase<=_;kase++) 

typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair<int,int> PII;

static const int INF=0x3f3f3f3f;
static const ll INFL=0x3f3f3f3f3f3f3f3f;
static const db PI=acos(-1.0);
static const db EPS=1e-8;

inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0' || ch>'9'){ if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0' && ch<='9'){ X=(X<<1)+(X<<3)+ch-'0'; ch=getchar(); }
	if(flag) return X;
	return ~(X-1);
}

inline void write(int X)
{
	if(X<0) { X=~(X-1); putchar('-'); }
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
static const int MAXN=500+10;
struct Node{
	int p;
	int st,cir;
};
vector<Node> route[MAXN]; 
int n,m;
int ans[MAXN];
bool vis[MAXN];
int main()
{
	memset(ans,0x3f,sizeof(ans));
	n=read(); m=read();
	for(int i=1;i<=m;i++)
	{
		int k=read(),st=read();
		route[i].push_back({st,0,0});
		int cnt=0;
		for(int j=0;j<k-1;j++)
		{
			int u=read(),v=read();
			cnt+=u;
			route[i].push_back({v,cnt,0});
		}
		int tmp=read(); cnt+=tmp;		
		for(int j=0;j<k;j++)
			route[i][j].cir=cnt;
	}
	for(int T=0;T<=1e6;T++)
	{
		vector<int> s[n+1];
		for(int i=1;i<=m;i++)
		{
			for(int j=0;j<route[i].size();j++)
				if(T%route[i][j].cir==route[i][j].st) s[route[i][j].p].push_back(i);
		}
		for(auto i:s[1]) vis[i]=true;
		for(int i=1;i<=n;i++)
		{
			bool flag=false;
			for(auto it:s[i])
				if(vis[it])
				{
					flag=true;
					break;
				}
			if(flag)
			{
				ans[i]=min(ans[i],T);
				for(auto it:s[i])
					vis[it]=true;
			}
		}
	}
	for(int i=2;i<=n;i++)
		if(ans[i]==INF) puts("inf");
		else printf("%d\n",ans[i]);
	return 0;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值