CCF-CSP-2

29-2垦田计划——二分

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k;
const int N=1e5+10;
struct p{
	int t,c;
}a[N];
bool check(int x)
{
	int sum=0;
	for(int i=0;i<n;i++)
		if(a[i].t>x) sum+=(a[i].t-x)*a[i].c;	
	if(sum>m) return false;
	return true;
}
int main()
{
	cin>>n>>m>>k;
	for(int i=0;i<n;i++)  cin>>a[i].t>>a[i].c;
	int l=k,r=1e5;
	while(l<r)
	{
		int mid=l+r>>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
	cout<<l;
}

28-2训练计划

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

20%

#include<iostream >
#include<cstring>
#include<algorithm>

using namespace std;
const int N=110;
int a[N],b[N],c[N];
int main()
{
	int n,m;
	cin>>m>>n;
	for(int i=0;i<n;i++)  cin>>a[i];
	for(int i=0;i<n;i++)   cin>>b[i];
	
	for(int i=0;i<n;i++)
	{
		if(a[i]==0)  c[i]=1;
		else
		{
			if(a[i-1]==0)  //不加if 语句70%
			c[i]=b[a[i]-1]+1;
			else
			c[i]=b[a[i]-1]+c[a[i]-1];
		}	
	}
	for(int i=0;i<n;i++)  cout<<c[i]<<" ";
}

70%

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=400;
struct p{
	int f,h;
}a[N];
int n,m;
int s[N];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)   cin>>a[i].f;
	for(int i=1;i<=m;i++)    cin>>a[i].h;
	
	//最早
	for(int i=1;i<=m;i++)
	   	if(a[i].f==0)  s[i]=1;
	   	else	s[i]=s[a[i].f]+a[a[i].f].h;
		   
    
    for(int i=1;i<=m;i++)  cout<<s[i]<<" ";
}

100%

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
const int N=110;
struct{
	int pre;
	int t;
	int ne;
	int nt;//之后需要的时间 
}a[N];
int n,m;
int b[N],c[N];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		cin>>a[i].pre;
	for(int i=1;i<=m;i++)
	   cin>>a[i].t;
	for(int i=m;i>=1;i--)
	{
		if(a[i].pre)
		 {
		   a[a[i].pre].ne=i;
		   a[a[i].pre].nt=max(a[i].nt+a[i].t,a[a[i].pre].nt);  //max
    	}
	}
	for(int i=1;i<=m;i++)
	{
		if(a[i].pre==0)
		  c[i]=1;
		else  c[i]=c[a[i].pre]+a[a[i].pre].t;
	}
	for(int i=1;i<=m;i++ )  cout<<c[i]<<' ';

	bool success=1;
	for(int i=1;i<=m;i++)
	{
		b[i]=n-a[i].nt-a[i].t+1;
		if(b[i]<=0)  success=false;
	}
	if(success)
	{
		cout<<endl;
		for(int i=1;i<=m;i++)  cout<<b[i]<<' ';
	}

}

27-2何以包邮

新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。一番浏览后,小 P
初步筛选出 n 本书加入购物车中,其中第 i 本(1≤i≤n
)的价格为 ai元。考虑到预算有限,在最终付款前小 P
决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。
试帮助小 P 计算,最终选购哪些书可以在凑够 x 元包邮的前提下花费最小?输入格式输入的第一行包含空格分隔的两个正整数 n 和 x,分别表示购物车中图书数量和包邮条件。

接下来输入 n 行,其中第 i 行(1≤i≤n)仅包含一个正整数 ai,表示购物车中第 i 本书的价格。输入数据保证 n本书的价格总和不小于 x。

输出格式
仅输出一个正整数,表示在满足包邮条件下的最小花费。

数据范围
70% 的测试数据满足:n≤15;全部的测试数据满足:n≤30,每本书的价格 ai≤104 且 x≤a1+a2+⋯+an。

输入样例1:
4 100
20
90
60
60
输出样例1:
110
样例1解释
购买前两本书 (20+90)
即可包邮且花费最小。

输入样例2:
3 30
15
40
30
输出样例2:
30
样例2解释
仅购买第三本书恰好可以满足包邮条件。

输入样例3:
2 90
50
50
输出样例3:
100
样例3解释
必须全部购买才能包邮。

70%

方法一:数据70%可过
通过暴力枚举的方法,采用二进制

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=34;
int a[N];
int main()
{
    int n,x;  cin>>n>>x;
    for(int i=0;i<n;i++)  cin>>a[i];
    
    int res=1e8;
    
    for(int i=0;i< 1<<n;i++)  //枚举0~2^n-1 
    {                    // 1<<2 1的二进制为0000 0001左移2位  0000 0100.
        int sum=0;
        for(int j=0;j<n;j++)           //注意是j<n
          if(i>>j&1)   sum+=a[j];
           
        if(sum>=x)  res=min(res,sum);
    }
    cout<<res<<endl;
}

方法二:数据70%可过
采用爆搜的方法

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=34;
int a[N];
int n,x;
int res=1e8;
void dfs(int u,int sum)
{
    if(u==n)
      {
          if(sum>=x)  res=min(res,sum);
      }
  else{
         //不选
        dfs(u+1,sum);
        //选
        dfs(u+1,sum+a[u]);
      }
}
int main()
{
     cin>>n>>x;
    for(int i=0;i<n;i++)  cin>>a[i];
    dfs(0,0);
    cout<<res<<endl;
}

100% 01背包问题

全部购买为sum,总价值不小于x,sum-x的值尽量大,则满足题意

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=33;
const int M=300010;  //注意取值范围
int w[N],f[N][M];
int n,x,sum;
int main()
{
	cin>>n>>x;
	for(int i=1;i<=n;i++) 
	{
		cin>>w[i];
		sum+=w[i];
	 } 
	 
	int v=sum-x;   //总容积 
	f[0][0]=0;  //从第i-1中选,总价格不大于j 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=v;j++) 
		{
			if(j<w[i])  f[i][j]=f[i-1][j];
			else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+w[i]);
		//	cout<<i<<" "<<j<<" "<<f[i][j]<<" "<<endl; 
		}
	}
	cout<<sum-f[n][v]<<endl;      //输出sum减背包最大值
}

26-2寻宝大冒险

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

100%

#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int ,int > PII;
const int N=1010,M=60,INF=1e8;
PII a[N]; 
int b[M][M];
int n,L,s,res;

int main()
{
	cin>>n>>L>>s;
	for(int i=0;i<n;i++) cin>>a[i].x>>a[i].y;
	int cnt=0;
	for(int i=s;i>=0;i--)
	  for(int j=0;j<=s;j++)
	     {
		 cin>>b[i][j];
		 cnt+=b[i][j];
     	}
	     
    for(int i=0;i<n;i++)
    {
    	int sum=0;
    	int x0=a[i].x,y0=a[i].y;
    	if(x0+s<=L&&y0+s<=L)      //可以等于
    	{
    	    for(int j=0;j<n;j++)
    		{
    			int x=a[j].x,y=a[j].y;
    		  if(x>=x0&&y>=y0&&x-x0<=s&&y-y0<=s)
        			 if(b[x-x0][y-y0])    sum++;
    			   	else     sum=-INF;  //注意!!!
			}	
		}
		if(sum==cnt)  res++;
	}
	cout<<res;
}

25-2出行计划

在这里插入图片描述

在这里插入图片描述

70%

#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
const int N=10010;
typedef pair<int ,int> PII;
PII a[N];
int q[N];
int main()
{
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=0;i<n;i++)  cin>>a[i].x>>a[i].y;
	for(int i=0;i<m;i++)  cin>>q[i];
	
	for(int i=0;i<m;i++)
	{
		int res=0;
		int t=q[i]+k;
		for(int j=0;j<n;j++)
		{
			if(a[j].x>=t&&a[j].y+t>a[j].x)  res++;
		}
		cout<<res<<endl;
	}
}

100%差分

1e5:时间复杂度控制在o(nlogn)以内

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=200010;   //注意:q的取值范围
int n,m,k;
int b[N];
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    while(n--)
    {
        int t,c;
        scanf("%d%d",&t,&c);    //q+k<=  t   <=q+k+c-1
        int l=t-k-c+1,r=t-k;
        if(r>0)  b[max(1,l)]++,b[r+1]--;  //判断条件要有
        
    }
    for(int i=1;i<=N;i++)  b[i]+=b[i-1];  //注意范围
 
    while(m--)
    {
        int t;
        scanf("%d",&t);
        // return 0;
        printf("%d\n",b[t]);
     //    return 0;
    }
    
}

24-2序列查询新解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

70%

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
const int N=1010;

int g[N],f[N],a[N];
int main()
{
	cin>>n>>m;
	int r=m/(n+1);
	for(int i=1;i<=n;i++)   cin>>a[i];
	int k=0,q=0;

	for(int i=1;i<=n;i++)
	for(int j=0;j<m;j++)
		if(a[i]<=j)  f[j]++;
		
	for(int i=0;i<m;i++)   g[i]=i/r;
		int sum=0;
	for(int i=0;i<m;i++)  sum+=abs(f[i]-g[i]);
	
	cout<<sum<<endl;
}

23-2非零段划分

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

60%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int a[N],s[N];
int main()
{
	int n;
	int max=-1e8;
	cin>>n;
	for(int i=0;i<n;i++)  
	{
		cin>>a[i];
		if(a[i]>max)  max=a[i];
	}
	
	if(max==0) 
	{
		cout<<"0"<<endl;
		return 0;
	}
	int maxv=0;
	for(int i=max;i>0;i--)
	{
	  for(int j=0;j<n;j++)  s[j]=a[j];
	  
		for(int j=0;j<n;j++)
			if(a[j]<i)  s[j]=0;
		
	//	for(int j=0;j<n;j++)  cout<<s[j]<<" ";
	//	cout<<endl;	
		int sum=0;
		if(s[0]!=0) sum=1;
		else  sum=0; 
		for(int j=1;j<n-1;j++)
		{
			
			if(s[j]==0&&s[j+1]!=0)  sum++;
			if(sum>maxv)  maxv=sum;
		}
	//	cout<<i<<" "<<sum<<endl;
	}
	
	cout<<maxv;
}

70%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
const int N=1e5;
int a[N],b[N];
int maxv=0;
int res;
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)  scanf("%d",&a[i]),maxv=max(maxv,a[i]);
	
	for(int i=1;i<=maxv;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(a[j]<i)
				b[j]=0;
			else b[j]=a[j];
		}
	//	for(int j=0;j<n;j++)  cout<<b[j]<<' '; cout<<endl;
		int cnt=0;
		int j=0;
		while(j<n)
		{
			if(b[j]!=0) cnt++;
			while(b[j]!=0) j++;
			while(b[j]==0) j++; 
		}
	//	cout<<cnt<<endl;
		if(cnt>res)  res=cnt;
	}
	cout<<res;
}

**前缀和,差分

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=5*1e5;
int n;
int a[N],b[N];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		cin>>a[i];
		if(a[i]>a[i-1])//后一个数比前一个数大,p取它们中间值的时候,就会出现一个非零段
	    {
	    	b[a[i-1]]++;
	    	b[a[i]]--;
		}
	 } 
	 int ans=0,t=0;
	 for(int i=0;i<N;i++)
	 {
	 	t+=b[i];
	 	ans=max(ans,t);
	 }
	 cout<<ans;
}

100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=500010,M=10010;
int n,a[N],cnt[M];//每个高度为i的山峰的贡献 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)  cin>>a[i];
	 n=unique(a+1,a+n+1)-a-1;//去重
	 a[0]=a[n+1]=0;
	 
	 for(int i=1;i<=n;i++)
	 {
	 	int x=a[i-1],y=a[i],z=a[i+1];
	 	if(x<y&&y>z) cnt[y]++;//山峰
		 else if(x>y&&y<z) cnt[y]--;//山谷 
	  } 
	  int res=0,sum=0;
	  for(int i=M-1;i;i--)
	  {
	  	sum+=cnt[i];
	  	res=max(res,sum);
	   }
	   cout<<res; 
 } 

22-2邻域均值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

100%

前缀和数组

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=610;
int a[N][N],s[N][N];

int n,l ,r,t;
int main()
{
	cin>>n>>l>>r>>t;
	
	for(int i=1;i<=n;i++) 
	for(int j=1;j<=n;j++)
	  cin>>a[i][j];
	  
	int res=0;
	for(int i=1;i<=n;i++) 
	for(int j=1;j<=n;j++)
		s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+a[i][j];
		

  for(int i=1;i<=n;i++)
    {
	for(int j=1;j<=n;j++)
    {
    	int x1=max(i-r,1),y1=max(j-r,1),x2=min(i+r,n),y2=min(j+r,n);
    	int sum=s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
    	int q=(x2-x1+1)*(y2-y1+1);
    	if(sum/q<t||(sum/q==t&&sum%q==0))   //注意这个地方,或者转化为double类型
		 res++;
	}
}
	cout<<res;	
}

21-2期末最佳阈值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

40%

#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int ,int>PII;
const int N=1e5+10; 
PII a[N];
int res,maxv;
int main()
{
	int m;
	cin>>m;
	for(int i=1;i<=m;i++)  cin>>a[i].x>>a[i].y;
	
	for(int j=1;j<=m;j++)
	{
		int cnt=0;
	for(int i=1;i<=m;i++)
	{
		int q=a[j].x;
		if(a[i].x>=q&&a[i].y==1)  cnt++;
		if(a[i].x<q&&a[i].y==0)   cnt++;
	}
	cout<<cnt<<" ";
	if(cnt>=maxv)  
	{
	 res=max(res,a[j].x);
	 maxv=cnt;
    }
  }
	cout<<res;
}

70%

#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=1e5+10;
int m;
struct p{
	int t,res;
}a[N]; 
set<int>b;
int main()
{
	cin>>m;
	for(int i=0;i<m;i++) 
	{
		cin>>a[i].t>>a[i].res;
		b.insert(a[i].t);
	 } 
	 int maxv=0,maxid=0;
	for(auto it=b.begin();it!=b.end();it++) 
	{
		int x=*it;
		int cnt=0;
		for(int i=0;i<m;i++)
		{
			if(a[i].t>=x&&a[i].res==1) cnt++;
			if(a[i].t<x&&a[i].res==0) cnt++;
		}
		if(cnt>=maxv)
		{
			maxv=cnt;
		    if(x>maxid) maxid=x;
		}
	}
	cout<<maxid<<endl;
}

20-2风险人群筛查

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

*100% 连续

#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
//连续k个点为逗留 
using namespace std;
typedef pair<int ,int> PII;
const int N=1010; 
PII a[N];
int n,k,t,xl,yd,xr,yu;
int main()
{
	cin>>n>>k>>t>>xl>>yd>>xr>>yu;
	int res1=0,res2=0;
	while(n--)
	{
		bool s1=0,s2=0;
		int cnt=0;
		for(int i=0;i<t;i++)  
		{
			cin>>a[i].x>>a[i].y;
			if(a[i].x>=xl&&a[i].x<=xr&&a[i].y>=yd&&a[i].y<=yu) 
			{
			      s1=true;
				  cnt++;	
			 } 
			 else    cnt=0;
			 if(cnt>=k)  s2=true;
     	}
	if(s2) res2++;
	if(s1)  res1++;
	}
	cout<<res1<<endl;
	cout<<res2<<endl;
}

19-2稀疏向量

在这里插入图片描述
在这里插入图片描述

60%暴力

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int n,a,b;
int c[N],d[N];
int main()
{
	cin>>n>>a>>b;
	while(a--)
    {
    	int x,y;
    	cin>>x>>y;
    	c[x]=y;
	}
	while(b--)
	{
		int x,y;
		cin>>x>>y;
		d[x]=y;
	 } 
	 int sum=0;
	 for(int i=1;i<=n;i++)
	 {
	 	sum+=c[i]*d[i];
	 }
	 cout<<sum;
}

100%**双指针

#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef long long int LL;
typedef pair<int ,int> PII; 
const int N=5*1e5+10;
int n,m;
PII a[N],b[N];
LL res;    //范围
int main()
{
   scanf("%*d%d%d",&n,&m);
   for(int i=0;i<n;i++)  scanf("%d%d",&a[i].x,&a[i].y);
   for(int i=0;i<m;i++)  scanf("%d%d",&b[i].x,&b[i].y);
   
   for(int i=0,j=0;i<n&&j<m;i++)
   {
   	while(j<m&&b[j].x<a[i].x) j++;
   	if(j<m&&a[i].x==b[j].x)  res+=(LL)a[i].y*b[j].y;
   	
   }
	 cout<<res;
}

18-2 回收站选址

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

50%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=510;
int n;
int cnt[5];
bool st[N][N];

int dx[4]={-1,1,-1,1},dy[4]={-1,-1,1,1};
bool check(int x,int y)
{
	int dx1[4]={-1,1,0,0},dy1[4]={0,0,-1,1};
	for(int i=0;i<4;i++)
	{
		int sx=x+dx1[i],sy=y+dy1[i];
		if(!st[sx][sy])  return false;
	}
	return true;
}
int main()
{
	cin>>n;
	while(n--)
	{
		int x,y;
		cin>>x>>y;
		st[x][y]=true;	
	}
	for(int i=0;i<=N;i++)
	   for(int j=0;j<=N;j++)
	   {
	   	   if(st[i][j]&&check(i,j))
	   	   {
	   	   	int res=0;
	   	   	for(int k=0;k<4;k++)
	   	   	{
	   	   		int x1=i+dx[k],y1=j+dy[k];
	   	   		if(st[x1][y1])   res++;
			 }
			 cnt[res]++;
		  }
	   }
	for(int i=0;i<5;i++)
	 cout<<cnt[i]<<endl;

 } 

100%

#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=1010;
PII q[N];
int dx[8]={-1,-1,-1,0,1,1,1,0},dy[8]={-1,0,1,1,1,0,-1,-1};
int n;
int cnt[5];
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>q[i].x>>q[i].y;
	for(int i=0;i<n;i++)
	{
		int s[8]={0};
		for(int j=0;j<n;j++)
			for(int k=0;k<8;k++)
				if(q[i].x+dx[k]==q[j].x&&q[i].y+dy[k]==q[j].y)
				    s[k]++;
			
		if(s[1]&&s[3]&&s[5]&&s[7])
			cnt[s[0]+s[2]+s[4]+s[6]]++;
		
	}
	for(int i=0;i<5;i++)
	  cout<<cnt[i]<<endl;
}

17-2 小明种苹果(续)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

70%

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,T,D,E;
const int N=1010;
bool st[N];
vector<int> a[N];
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int x;	cin>>x;
		a[i].push_back(x);
		while(x--)
		{
			int c;	cin>>c;
			a[i].push_back(c);
		}
	}

	for(int i=0;i<n;i++)
	{
	   int sum=0;
	    for(int j=a[i][0];j>=1;j--)
	    {
	          sum+=a[i][j];
			  if(a[i][j]>0)   break;	  
		}
			 T+=sum;
		int cnt=a[i][1];
		for(int j=2;j<=a[i][0];j++)
		{
		    if(a[i][j]>0 ) 
			{
				if(a[i][j]!=cnt)
				{
					st[i]=1;D++;
				  }  
				break;
			 } 
			cnt+=a[i][j];	
		}
	}
	st[n]=st[0],st[n+1]=st[1];
    int cnt=0;
	for(int i=0;i<n+2;i++)
	{
		
		if(st[i])  cnt++;
		if(cnt>=3) 	E++;
		if(!st[i])  cnt=0;
	}
	cout<<T<<" "<<D<<" "<<E<<endl;
 } 

50%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int a[N][N];
int n;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i][0];
		for(int j=1;j<=a[i][0];j++)
		cin>>a[i][j];	
	}
	int cntD=0,cntE=0;
	int cntT=0,cnt=0;
	for(int i=0;i<n;i++)
	{
	  int sum=a[i][1];
	  bool flag=0;
	  for(int j=2;j<=a[i][0];j++)
	  {
	  	  if(a[i][j]<=0)  sum+=a[i][j];
	  	  else 
		 {
	  	  	if(sum!=a[i][j]) flag=1;
		      sum=a[i][j];
	  	  }
	    }
	    cntT+=sum;
	    if(flag)  cnt++;
	    if(cnt>=3) cntE++;
	    if(!flag) cnt=0;
	    if(flag) cntD++;
     }
	 cout<<cntT<<' '<<cntD<<' '<<cntE;
}

16-2二十四点

在这里插入图片描述
在这里插入图片描述

40%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string s;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		cin>>s;
		int res=s[0]-'0'; 
		for(int i=1;s[i]!='\0';i=i+2)
		{
			if(s[i]=='-')
		    res=res-s[i+1]+'0';
		    else res=res+s[i+1]-'0';   
		}
		if(res==24)  puts("Yes");
		else  puts("No");
	}
}

**100%

#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<unordered_map>
using namespace std;

stack<int>num;
stack<char> op;
void eval()
{
	int b=num.top();num.pop();
	int a=num.top();num.pop();
	char c=op.top();op.pop();
	int x;
	if(c=='+') x=a+b;
	else if(c=='-')  x=a-b;
	else if(c=='x') x=a*b;
	else
	{
		if(a*b>=0) //同号 
		    x=a/b;
		else  //向下取整 
		{
		 	if(a%b==0)  x=a/b;
		 	else x=a/b-1;
		} 
	}
	num.push(x);
}
int main()
{
	int n;
	cin>>n;
	
	unordered_map <char,int>pr;
	pr['+']=pr['-']=1;
	pr['x']=pr['/']=2;
   while(n--)
  {
	string str;
	cin>>str;
	num=stack<int>();// 清空
	op=stack<char>();
	for(auto c:str)
	{
		if(c>='0'&&c<='9') num.push(c-'0');
		else
		{
			while(op.size()&&pr[op.top()]>=pr[c]) eval();
			op.push(c);
		}
	 } 
	 while(op.size()) eval();
	 if(num.top()==24)  puts("Yes");
	 else  puts("No");
  }
}

15-2小明放学

在这里插入图片描述
在这里插入图片描述

20%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct p{
	int k,t;
}q[N];
int r,y,g;
int n;
int main()
{
	cin>>r>>y>>g;
	cin>>n;
	for(int i=0;i<n;i++)  cin>>q[i].k>>q[i].t;
	long long sum=0; 
	for(int i=0;i<n;i++)
	{
		if(q[i].k==0) 	sum+=q[i].t;
		if(q[i].k==1)  //红
		{
		//	int tt=sum-q[i].t;
			int tt=tt%(r+y+g);
			if(tt<=q[i].t)  sum+=tt+y;
			else if(tt<=y+q[i].t)  sum+=tt; 
			
		} 
		if(q[i].k==2)  //黄 
		{
		    int tt=sum-q[i].t;
	        tt=tt%(r+y+g);
		    if(tt>g+r)  sum+=r+y-tt; 
		    cout<<tt<<' '<<r+y-tt<<endl;
			
		}
		if(q[i].k==3)  //绿
		{
			int tt=sum-q[i].t;
			tt=tt%(r+y+g);
			if(tt<=r+y)  sum+=r+y-tt; 
			cout<<tt<<' '<<r+y-tt<<endl;
		 } 
	} 
	cout<<sum;
}

100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int r,y,g;
int  n;
long long int sumt;
int main()
{
	cin>>r>>y>>g;  //红,黄,绿;
	cin>>n;
	while(n--)
	{
		long long int k,t;
		cin>>k>>t;
		if(k==0)  sumt+=t;
		else{
		
		if(k==1)  //红灯 
		    t=r-t;
		 if(k==2)
		    t=r+g+y-t;
		if(k==3)
		  t=r+g-t;
		t+=sumt;
		t=t%(r+g+y);
		if(t<r) sumt+=r-t;
		if(t>=r+g) sumt+=r+g+y-t+r;
	
		}	
	}
	cout<<sumt;
	 
}

14-2买菜

在这里插入图片描述
在这里插入图片描述

100% 题意

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int g[N],s[N];    //注意范围!!!!!
int n,res,maxv,minv=1e8;
int main()
{
	scanf("%d",&n);
	for(int i=0;i<2*n;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		g[a]++;
		g[b]--;
		minv=min(minv,a);
		maxv=max(maxv,b);
	}
	for(int i=1;i<maxv;i++)  s[i]=s[i-1]+g[i];
	for(int i=minv;i<maxv;i++)  //从0开始到M
	 if(s[i]==2)   res++;
	cout<<res;
	
}

*13-2碰撞的小球

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

*100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,L,t;
const int N=110;
struct ball{
	int id,f;
}a[N];
int main()
{
	cin>>n>>L>>t;
	for(int i=0;i<n;i++)
	{
		cin>>a[i].id;
    	a[i].f=1;
	}
	while(t--)
	{
		for(int i=0;i<n;i++)
		{
			a[i].id+=a[i].f;
			if(a[i].id==L||a[i].id==0)
			  a[i].f*=-1;   //掉头		 
		}
		for(int i=0;i<n;i++)
		  for(int j=i+1;j<n;j++)
		    {
		    	if(a[i].id==a[j].id)
		    	  {
		    	  	a[i].f*=-1;
		    	  	a[j].f*=-1;
				  }
			}
	}
	for(int i=0;i<n;i++)
	 cout<<a[i].id<<' ';
}

12-2游戏-队列

在这里插入图片描述
在这里插入图片描述

100%*

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
	int n,k;
	cin>>n>>k;
	queue<int> q;
	for(int i=1;i<=n;i++)  q.push(i);
	int j=1;
	while(q.size()>1)
	{
		int t=q.front();
		q.pop();
		if(j%k!=0&&j%10!=k)  q.push(t);
		j++;
	}
	cout<<q.front();
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int>PII;
int main()
{
	int n,k;
	cin>>n>>k;
	queue<PII>q;
	for(int i=1;i<=n;i++)  q.push({i,i});
    
	while(q.size()>1)
	{
		PII t=q.front();
		q.pop();
		if(t.y%10!=k&&t.y%k!=0) 
			q.push({t.x,++n});  //n++ 就错误?{1,6} 不删除 
	}
	PII m=q.front();
	cout<<m.x;
}

11-2公共钥匙盒

在这里插入图片描述
在这里插入图片描述

10-2学生排队

在这里插入图片描述
在这里插入图片描述

100%

#include<iostream>
#include<cstring>
#include<cstring>

using namespace std;
int n,T;
const int N=1010;
int a[N];
int main()
{
	cin>>n>>T;
	for(int i=1;i<=n;i++)  a[i]=i;
	
	while(T--)
	{
		int a1,b;
		cin>>a1>>b;
		int k=0;
		for(int i=1;i<=n;i++)
		  if(a[i]==a1)
		     k=i;  //找到要交换的位置
		if(b>0)
		{
			for(int i=0;i<b;i++)
				swap(a[k+i],a[k+i+1]);
		} 
		if(b<0)
		{
			b=-b;
			for(int i=0;i<b;i++)
			  swap(a[k-i],a[k-i-1]);
		}
	}
	for(int i=1;i<=n;i++)  cout<<a[i]<<' ';
}

*9-2工资计算

在这里插入图片描述

100%枚举/二分

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int T;
int a[]={0,1500,4500,9000,35000,55000,80000,200000};
int b[]={0,3,10,20,25,30,35,45};
int get(int x)
{
	if(x<=3500)  return x;
	int res=x-3500; 
    int tax=0;
   
	for(int i=0;i<8;i++)
     if(res>a[i])  
	 	tax+=(min(a[i+1],res)-a[i])/100*b[i+1];
	 else break;
	return x-tax;
}
int  main()
{
	cin>>T;
     for(int i=0;i<=200000;i+=100)
     {
     	if(get(i)==T)
     	 {
     	 	cout<<i<<endl;
     	 	break;
		  }
	 }
}

8-2火车购票

在这里插入图片描述

90%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
const int N=110;
int a[N];
int q[N][N];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)  cin>>a[i];
	int k=1;
	for(int i=0;i<N;i++)
	  for(int j=1;j<=5;j++)
	   	q[i][j]=k++;
	  
	for(int i=0;i<N;i++)  q[i][0]=5;

	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=N;j++)
		 {
		  if(q[j][0]>=a[i])
		  {
		  	q[j][0]-=a[i];
		  	for(int k=1,cnt=1;cnt<=a[i];k++)
		  	  {
		  	  	if(q[j][k]!=0)
		  	  	   {
		  	  	   	  cout<<q[j][k]<<' ';
		  	  	   	   q[j][k]=0;
		  	  	   	   cnt++;
					 }
				}
				cout<<endl; 
				break; 
		    }
		
		  }
		  
	}
	
}

7-2俄罗斯方块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

90%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=20;
int g[N][N],backup[N][N],g2[N][N];
int a[N][N];
int c;
bool check(int x)
{
	memcpy(backup ,g,sizeof g);
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<4;j++)
		{
			backup[x+i][c+j]+=a[i][j]; 
			if(backup[x+i][c+j]==2)  return false;
		}
	}
	memcpy(g2 ,backup,sizeof backup);
	return true;
}
int main()
{
	for(int i=0;i<15;i++)
	  for(int j=0;j<10;j++)
	     cin>>g[i][j];
	 for(int i=0;i<10;i++)  //加一层地板 
	    g[15][i]=1;
	
	for(int i=0;i<4;i++)
	  for(int j=0;j<4;j++)
	    cin>>a[i][j]; 
     cin>>c;
      c--;
      for(int i=0;i<15;i++)
      {
      	if(!check(i))
      	{
      		for(int i=0;i<15;i++)
      		  {
				for(int j=0;j<10;j++)	cout<<g2[i][j]<<' ';
			    cout<<endl;	    
      		  }
      		 return 0;
	     }
	  }
 } 

6-2消除类游戏

在这里插入图片描述
在这里插入图片描述

100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
const int N=40;
int a[N][N],b[N][N];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=m;j++)
	     cin>>a[i][j];
	     memcpy(b,a,sizeof a);
	for(int i=1;i<=n;i++)
	   for(int j=1;j<=m;j++)
	   {
	   	   //左右
		   int l=j,r=j;
		   int k=a[i][j];
		   while(a[i][r+1]==k&&r+1<=m)  r++;
		   while(a[i][l-1]==k&&l-1>0)  l--;
		    int p=i,d=i;
			while(a[p-1][j]==k&&p-1>0)  p--;
			while(a[d+1][j]==k&&d+1<=n) d++;
		//	
			if(r-l+1>=3)
			{
			//	cout<<i<<' '<<l<<' '<<r<<endl;
				 for(int z=l;z<=r;z++)
				   b[i][z]=0;
		    } 
		     if(d-p+1>=3)
		   {
		   	for(int z=p;z<=d;z++)
		    	  b[z][j]=0;
			}
	   }
	   for(int i=1;i<=n;i++)
	     {
	     	for(int j=1;j<=m;j++)
	     	  cout<<b[i][j]<<' ';
	     	  cout<<endl;
		 }
	        
}

5-2日期计算

在这里插入图片描述

100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int d[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int y,n;
int main()
{
	cin>>y>>n;
	int t=0;
	if(y%4==0&&y%100!=0||y%400==0)  t=1;  //闰年 
	int sum=0,i=1;
	while(sum<n)
	{
    	sum+=d[t][i];
		i++;
	} 
	sum-=d[t][i-1];
	cout<<i-1<<endl;
	cout<<n-sum<<endl;
}

4-2数字排序

在这里插入图片描述

60%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
struct p{
	int num,c;
	bool operator<(const p&t)const{
		if(t.c==c)  return num<t.num;
		else   return t.c<c;  //大到小
	}
}a[N];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int x;  cin>>x;
		a[x].num=x;
		a[x].c++;
	}
	sort(a,a+n);
	for(int i=0;i<n;i++)
    	if(a[i].num||a[i].c)
	  cout<<a[i].num<<' '<<a[i].c<<endl; 
 } 

3-2*Z字形扫描

在这里插入图片描述
在这里插入图片描述

100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=510;
int a[N][N];
int n;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	   for(int j=1;j<=n;j++)
	      scanf("%d",&a[i][j]);
	for(int i=2;i<=2*n;i++)
	{
		if(i%2==0)// up
		{
			for(int j=1;j<i;j++)
			  if((i-j)>=1&&(i-j)<=n&&j>=1&&j<=n)
			   cout<<a[i-j][j]<<' ';
		 } 
		 else
		 {
		 
		 	for(int j=1;j<i;j++)
			  if(j>=1&&j<=n&&(i-j)>=1&&(i-j)<=n) 
		 		cout<<a[j][i-j]<<' ';
			 
		 }
	}
}

2-2画图

在这里插入图片描述
在这里插入图片描述

100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
bool st[N][N];
int n,res;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
 	 for(int j=x1+1;j<=x2;j++)
	    for(int k=y1+1;k<=y2;k++)
	       st[j][k]=1;
	}

	  for(int i=0;i<N;i++)
	    for(int j=0;j<N;j++)
	      if(st[i][j])  res++;
	      
	    cout<<res;
}

1-2窗口

在这里插入图片描述
在这里插入图片描述

100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
const int N=20;
struct p{
	int id,x1,y1,x2,y2;
}a[N];

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		a[i].id=i;
		cin>>a[i].x1>>a[i].y1>>a[i].x2>>a[i].y2;
	}
	while(m--)
	{
		int x,y;
		cin>>x>>y;
		p temp;
		bool flag=0;
		for(int i=n;i>=1;i--)
		{
       	  if(x>=a[i].x1&&x<=a[i].x2&&y>=a[i].y1&&y<=a[i].y2)
			  {
			  	int t=i;
			  	temp=a[t];
			  	for(int k=t+1;k<=n;k++)   a[k-1]=a[k];
			  	a[n]=temp;
			    cout<<temp.id<<endl;
				flag=1;
				break;
			  }
			 
		}
		 if(flag==0)  puts("IGNORED");
	}
 } 

0-2ISBM号码

在这里插入图片描述

100%

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string s;
int main()
{
	cin>>s;
	int i=0,j=1,res=0;
	int n=s.length()-1;
	while(n--)
	{
		if(s[i]!='-') 
		{
			res+=(s[i]-'0')*j;
			j++;
		 } 
		 i++;
	}
	
	res=res%11;

	if(res==10)
	{
		if(s[12]=='X')puts("Right");
		else 
		{
			s[12]='X';
	    	cout<<s;
		}
	  }  
	else 
	{
		if(res==s[12]-'0')   puts("Right");
		else 
        	{
        		s[12]=res+'0';
	    	    cout<<s<<endl;
      	   }
	}
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值