https://www.jisuanke.com/contest/730
第一题,从大到小排序,依次取就可以
#include<bits/stdc++.h>
using namespace std;
int a[105];
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d",&a[i]);
a[i]--;
}
sort(a,a+m,cmp);
int i;
int ans=0;
n--;
for(i=0;i<m;i++)
{
//printf("%d\n",n);
if(n<=0)
{
break;
}
n=n-a[i];
ans++;
}
if(n>0)
{
printf("Impossible");
return 0;
}
printf("%d\n",ans);
return 0;
}
// 1 6 1 2
第二题:我是暴力匹配的,复杂度m*n*n
#include<bits/stdc++.h>
using namespace std;
int a[105];
int b[105];
int B[105];
int A[105];
int main()
{
int n,m;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
while(m--)
{
int N;
scanf("%d",&N);
memset(B,0,sizeof(B));
memset(A,0,sizeof(A));
for(int i=0; i<N; i++)
{
scanf("%d",&b[i]);
B[b[i]]++;
}
if(N>n)
{
printf("0\n");
continue;
}
for(int i=0; i<N; i++)
{
A[a[i]]++;
}
int ans=0;
int f=0;
for(int j=0; j<=n; j++)
{
if(A[j]==B[j])
{
}
else
{
f=1;
break;
}
}
if(f==0)
{
ans++;
}
for(int i=0; i<n; i++)
{
A[a[i]]--;
A[a[i+N]]++;
int f=0;
for(int j=0; j<=n; j++)
{
if(A[j]==B[j])
{
}
else
{
f=1;
break;
}
}
if(f==0)
{
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[50005];
int b[50005];
int B[50005];
int A[50005];
//map<int ,int > ma;
int main()
{
int n,m;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
while(m--)//500
{
int N;
scanf("%d",&N);
memset(B,0,sizeof(B));
memset(A,0,sizeof(A));
//ma.clear();
for(int i=0; i<N; i++)
{
scanf("%d",&b[i]);
B[b[i]]++;
}
if(N>n)
{
printf("0\n");
continue;
}
for(int i=0; i<N; i++)
{
A[a[i]]++;
}
int ans=0;
int f=0;
int no=0;
for(int j=0; j<=n; j++)
{
if(A[j]==B[j])
{
}
else
{
f=1;
no++;
// ma[j]=1;
}
}
if(f==0)
{
ans++;
}
for(int i=0; i<n; i++)
{
if(i+N>=n)
{
break;
}
int c=a[i];
int d=a[i+N];
int ak1=0,ak2=0;
if(A[c]==B[c])
{
ak1=1;
}
if(A[d]==B[d])
{
ak2=1;
}
A[a[i]]--;
A[a[i+N]]++;
if(a[i]==a[i+N])
{
if(no==0)
{
ans++;
}
continue;
}
if(B[a[i]]==A[a[i]])
{
if(ak1==0)
{
no--;
}
}
else
{
if(ak1==1)
{
// ma[a[i]]=1;
no++;
}
}
if(B[a[i+N]]==A[a[i+N]])
{
if(ak2==0)
{
// ma[a[i+N]]=0;
no--;
}
}
else
{
if(ak2==1)
{
// ma[a[i+N]]=1;
no++;
}
}
if(no==0)
{
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}