POJ 3061:
For each the case the program has to print the result on separate line of the output file.if no answer, print 0.
Sample Input
2 10 15 5 1 3 5 10 7 4 9 2 8 5 11 1 2 3 4 5
Sample Output
2 3
题意:
2为样例数;
举第一组样例:
10为有十个数,15为 求和为15的最少的连续的数的个数
该题为尺取模板题,通过例题理解尺取:
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 55; int main() { int a[100100],i,t,t1,ge,sum,n,m,ans; scanf("%d",&t1); while(t1--) { scanf("%d%d",&n,&m); memset(a,0,sizeof(a)); for( i=0; i<=n-1; i++) scanf("%d",&a[i]); i=0; t=0; ge=0; sum=0; ans=0x3f3f3f3f; while(i<=n) { if(sum<m) { sum+=a[i++]; ge++; } else if(sum>=m) { sum-=a[t++]; ge--; } if(sum>=m) ans=min(ans,ge); } if(ans!=0x3f3f3f3f) printf("%d ",ans); else printf("0 "); } }
给出一个字符串,求该字符串的一个子串s,s包含A-Z中的全部字母,并且s是所有符合条件的子串中最短的,输出s的长度。
如果给出的字符串中并不包括A-Z中的全部字母,则输出No Solution。
Input第1行,1个字符串。字符串的长度 <= 100000。Output输出包含A-Z的最短子串s的长度。如果没有符合条件的子串,则输出No Solution。
Sample Input
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
Sample Output
28
#include <iostream> #include <string.h> #include <stdio.h> #include<map> using namespace std; map<int,int>mp; map<int,int>::iterator it; int f() { int ge=0; for(it=mp.begin(); it!=mp.end(); it++) { if(it->second!=0) ge++; } if(ge==26) return 1; return 0; } int main() { int i,ge=0; char a[100010]; scanf("%s",a); int b=strlen(a); i=0; int t=0; int ans=0x3f3f3f3f; while(i<=b) { int t1=f(); if(t1==0) { mp[a[i]-'A']++; i++; ge++; } if(t1==1) { ans=min(ans,ge); } if(t1==1) { mp[a[t++]-'A']--; ge--; } } if(ans!=0x3f3f3f3f) printf("%d ",ans); else printf("No Solution "); }