?? acm1746.cpp
字號:
#include <iostream>
using namespace std;
int main(){
int text;
cin>>text;
while(text--){
int max=0,num,v,i,j,n,m,a[11],k[11]={0};
int r,s,s1;
int flag[1000]={0};//用數(shù)組flag[i]存儲是否能產(chǎn)生面值為i郵票組合。
cin>>n>>m;
for(i=1;i<=n;i++){
cin>>a[i];
if(a[i]>max)
max=a[i];//max為最大的面值。
}
i=1; k[i]=-1;
while(i>=1){
while(k[i]<m){
k[i]=k[i]+1;
num=0; v=0;
for(j=1;j<=i;j++){
num=num+k[j];
v=v+k[j]*a[j];
}
if(num<=m){
flag[v]=1;
if(i<n){
i=i+1;
k[i]=-1;
}
}
}//回溯
i=i-1;
}
//for(i=1;i<=m*max;i++)//輸出數(shù)組flag串。
// cout<<flag[i];
//cout<<endl;
s=0; s1=0; //s最長的連續(xù)1串的長度。s1為當前的連續(xù)1串的長度。
r=0;//記錄最長1串的最后一個'1'在數(shù)組flag中的位置。
flag[m*max+1]=0;//為以下查找方便增加數(shù)組長度。
for(i=1;i<=m*max+1;i++)
{
if(flag[i]==0)
{
if(s1>s){ s=s1; r=i-1;}//更新最長連續(xù)1串的長度,記錄最長1串的
s1=0; //最后一個'1'在數(shù)組flag中的位置。
}
else
s1++;
}
cout<<r-s+1<<' '<<r<<endl;
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -