CodeForces - 620C Pearls in a Row 贪心 STL
这题找规律,从第一个数开始向后搜索,当有一个数字重复时则记录该位置,再从下一个数字开始向后重新搜索。可使用STL中的set函数
AC代码
#include<stdio.h> #include<set> using namespace std; int pos[300005]; set<int>a; int main() { int n,m=0,b; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&b); if(a.count(b)==0)//检查b是否出现过 { a.insert(b);//在末尾插入b } else { pos[m]=i; m++; a.clear();//清除a中数据 } } if(m==0) { printf("-1\n"); } else { pos[m-1]=n; printf("%d\n",m); printf("1 %d\n",pos[0]); for(int i=0;i<m-1;i++) { printf("%d %d\n",pos[i]+1,pos[i+1]); } } return 0; }
最近刚学的STL,本来想用循环来搜索重复数字的,结果超时,不过可作为思路
#include<stdio.h> int a[300005],pos[300005]; int main() { int n,m=0; pos[m]=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); for(int j=pos[m]+1;j<i;j++) { if(a[j]==a[i]) { m++; pos[m]=i; } } } if(m==0) { printf("-1\n"); } else { pos[m]=n; printf("%d\n",m); printf("1 %d\n",pos[1]); for(int i=1;i<m;i++) { printf("%d %d\n",pos[i]+1,pos[i+1]); } } return 0; }