B1045
1.前面最大的数<=主元素<=后面最小的数
2.找出所有位置的后面的最小的数,放入数组中,方便后续查找
3.找出前面最大的数,如果该数比前面最大的数小,则该数一定不是主元素
#include<stdio.h> #include<algorithm> using namespace std; int main() { int n; int a[100000]; int num=0; //可能的主元个数 int ans[10000]; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } int max=a[0]; int right_min[100000]={0}; right_min[n-1]=a[n-1]; right_min[n-2]=a[n-1]; //找出每个元素右边最大的元素 for(int i=n-3;i>=0;i--) { if(a[i+1]<right_min[i+1]) { right_min[i]=a[i+1]; } else { right_min[i]=right_min[i+1]; } //printf("%d %d\n",a[i],right_min[i]); } for(int i=0;i<n;i++) { //找出a[i]左边最大的数 if(a[i]>=max) { max=a[i]; // if(a[i]<=right_min[i]) { //printf("*%d\n",a[i]); ans[num]=a[i]; num++; } } } sort(ans,ans+num); printf("%d\n ",num); for(int i=0;i<num;i++) { if(i==0) { printf("%d",ans[i]); } else { printf(" %d",ans[i]); } } printf("\n"); return 0; }
1.使用sort()函数时不仅要加algorithm头文件还要加using namespace std;
2.本题最后不加回车的话有一个测试点过不了,出现格式错误
B1040
代码
#include<stdio.h> #include<string.h> #define MAX 100000 #define MOD 1000000007 char a[MAX]; int main() { gets(a); //统计每一个位置左边p的个数; int left_p[MAX]={0}; int n=strlen(a); for(int i=0;i<n;i++) { //printf("%c-->",a[i]); if(i>0) { left_p[i]=left_p[i-1]; } if(a[i]=='P') { left_p[i]+=1; } //printf("%d\n",left_p[i]); } int total_PAT=0; int right_T=0; for(int i=n-1;i>=0;i--) { if(a[i]=='T') { right_T++; } if(a[i]=='A') { total_PAT=(total_PAT+left_p[i]*right_T)%MOD; } } printf("%d",(total_PAT%MOD)); return 0; }
注意事项
1.及时取模(在倒数第三个语句中要及时取模),否则在最后才取模的话会造成误差,导致结果错误。
2.思路精巧,统计A左边的P的个数和右边T的个数,用乘积得出PAT的个数,尽量少用嵌套循环。