1. 程式人生 > 其它 >黑龍江農墾科技職業學院喜迎寒假多校聯賽2(快樂ak場)蒟弱部分題解

黑龍江農墾科技職業學院喜迎寒假多校聯賽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;
} 

其他題目都比較容易或者沒坑了