黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)蒟弱部分题解

A

双指针,数据太大,实在难受,不想写了

D.ssue与lifehappy给学生分组

题目链接

思路

二分答案,二分没觉每一个答案,每次检查分组个数是否大于等于m


#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N = 1e6+9;
ull a[N];
ull b[N];
ull r =0,l;
	int n,m;
int check(ull x)
{
    
    
	ull sum = 0,cnt=0;
	for(int i=1; i<=n; i++)
	{
    
    
		sum+=a[i];
		if(sum>x) 
		{
    
    
			sum = a[i];
			cnt++;
		}
	}
	if(cnt>=m) return 1;
	else return 0;
}
int main()
{
    
    


	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++)
	{
    
    
		scanf("%llu",&a[i]);
		r+=a[i];
		l  = max(l,a[i]);	
	}
	while(l<=r)
	{
    
    
		ull mid = l+r>>1;
		//如果分得组数,>=m,那么还可以m 
		if(check(mid)==1) l = mid+1;
		else r = mid-1;
	}
	printf("%llu\n",l);
	return 0;
} 

E.删删删越小越好

思路

  • 如果当前数字的左边有元素大于它,那么就删除它左边比它大的元素
  • 单调栈的运用,如果栈顶的元素大于当前元素,那么就出栈,k-1,前提是k不为0
  • 一定要注意,输出的时候k还可能不为0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e7+9;
char stk[N],s[N]; 
int tt = 0,k;
int main()
{
    
    
    scanf("%s",s+1);
    scanf("%d",&k);
    int n  = strlen(s+1);
    //cout<<k<<" "<<n<<endl;
    for(int i=1; i<=n; i++)
    {
    
    
    	while(tt&&stk[tt]>s[i]&&k) 
		{
    
    
		   tt--;
		   k--;	
		}
    	stk[++tt] = s[i];
	}
	stk[tt+1]='\0';
	int flag = 0;
	for(int i=1; i<=tt-k; i++)
	{
    
    
		if(stk[i]!='0') 
		{
    
    
			flag = 1;
		}
		if(flag) printf("%c",stk[i]);
	}
	if(!flag) puts("0");
    return 0;
}

G

暴力,我觉得数据有问题,数据里貌似含有
AAlanhij%%这样类似的数据

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+9;
typedef  long long ll;
string s;
char s0[N];
string p = "Alan";
int main()
{
    
    
	 int n;
	 cin>>n;
	 getchar();
	 int ans = 0;
	 while(n--)
	 {
    
    
		 getline(cin,s);
		// cout<<s<<endl;
		 int t = 0;
		 for(int i=0; i<s.size(); i++)
		 {
    
    
		   if(s[i]!=' ') s0[t++]  = s[i];
		 }
		 int cnt = 0;//记录%的个数 
		 s0[t]='\0';
		 //cout<<s0<<endl;
		 int flag = 0;
		 for(int i=0; i<t; i++)
		 {
    
    
		 	 if(s0[i]=='%') cnt++;
		 	 if(s0[i]=='A'&&flag==0)
			  {
    
    
			  	int mark = 1;
			  	int j;
			  	for( j=i; j<t&&j<i+4; j++)
			  	{
    
    
			  		if(s0[j]!=p[j-i]) 
			  		{
    
    
			  			mark = 0;
			  			break;
					}
				}
				if(!mark) flag =0;
				else
				{
    
    
					//if(i&&((s0[i-1]>='A'&&s0[i-1]<='Z')||(s0[i-1]>='a'&&s0[i-1]<='z'))) flag = 0;
					//else if(j<t&&((s0[j]>='A'&&s0[j]<='Z')||(s0[j]>='a'&&s0[j]<='z'))) flag  = 0;
					//else flag = 1;
					flag = 1;
				}
			  } 
		 }
		 if(flag) ans+=cnt;
		// cout<<ans<<endl;
	 }
	 cout<<ans<<endl;
	return 0;
} 

H&I

思路

结构体排序,但是很多人入坑,因为sort是不稳定的排序,很多人死在了"同用户名先输入的在前面"上,虽然本地测试是正确的,但是提交上去测试还是有可能不能保证"同用户名先输入的在前面",所以需要多加一个条件
这是我wa的。。。。
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+9; 
struct node
{
    
    
	string s,m,x,h;
	int num;
}p[N];
bool cmp( node A,  node B)
{
    
    
	if(A.s.size()<B.s.size()) return true;
	else if(A.s.size()>B.s.size())  return false;
	else if(A.s!=B.s) return A.s<B.s;
	else return A.num<B.num;
}
int main()
{
    
    
	 int n;
	 //ios::sync_with_stdio(false);
	// cin.tie(0);
	 cin>>n;
	 for(int i=0; i<n; i++)
	 {
    
    
        cin>>p[i].s>>p[i].m>>p[i].x>>p[i].h;
        p[i].num = i;
	 }
	 sort(p,p+n,cmp);
	 for(int i=0 ;i<n; i++)
	 {
    
    
	 	cout<<p[i].s<<" "<<p[i].m<<" "<<p[i].x<<" "<<p[i].h<<endl;
	 }
	return 0;
} 

其他题目都比较容易或者没坑了

猜你喜欢

转载自blog.csdn.net/qq_45769627/article/details/113093529