黑龍江農墾科技職業學院喜迎寒假多校聯賽2(快樂ak場)蒟弱部分題解
阿新 • • 發佈:2021-01-25
文章目錄
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;
}
其他題目都比較容易或者沒坑了