Subsequence POJ - 3061
题意 给定n和s 求n个数中满足大于等于s的最小长度
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f
typedef long long ll;
const int N=100000+5;
ll a[N];
int main ()
{
int t,n,i;
ll s,sum;
scanf("%d",&t);
while(t--)
{
scanf("%d%lld",&n,&s);
for(i=0; i<n; i++)
scanf("%lld",&a[i]);
int l=0,r=0;
int ans=0x3f3f3f;
sum=0;
while(1)
{
while(r<n&&sum<s) sum+=a[r++];
if(sum<s) break;
ans=min(ans,r-l);
sum-=a[l++];
}
if(ans==inf) ans=0;
printf("%d\n",ans);
}
return 0;
}
Jessica’s Reading Problem POJ - 3320
题意
给定n页 每页都有相应的知识点 求复习完所有知识点的最小连续页数,用到了map映射,可以去重 还有set
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
#define inf 0x3f3f3f
typedef long long ll;
const int N=100000+5;
int a[N];
map<int,int>M;
set<int>t;
int main ()
{
int n;
while(~scanf("%d",&n))
{
t.clear();
M.clear();
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
t.insert(a[i]);
}
int l=0,r=0;
int s=t.size();
int sum=0,ans=n;
while(l<n)
{//printf("%d %d\n",sum,s);
while(r<n&&sum<s)
{
if(M[a[r]]==0)
sum++;
M[a[r]]++;
r++;
}
if(sum<s) break;
ans=min(ans,r-l);
M[a[l]]--;
if(M[a[l]]==0)
sum--;
l++;
}
printf("%d\n",ans);
}
return 0;
}