T1
统计前缀和 以及 后缀的0的数量
答案显然就是min{当前位置1的个数+当前位置后的零的个数}
加个特判 当全都是0或1时 输出0
#include <cstring> #include <cstdio> #define N 100005 char str[N]; int ans,len,a[N],sum0[N],sum1[N]; inline int min(int a,int b) {return a>b?b:a;} int main(int argc,char *argv[]) { freopen("reverse.in","r",stdin); freopen("reverse.out","w",stdout); scanf("%s",str); ans=len=strlen(str); for(int i=0;i<len;++i) a[i+1]=str[i]-'0',sum1[i+1]=sum1[i]+a[i+1]; for(int i=len;i>=1;--i) sum0[i]=sum0[i+1]+(a[i]==0?1:0); if(sum0[1]==0||sum1[len]==0) {printf("0");return 0;} for(int i=1;i<=len;++i) ans=min(ans,sum1[i]+sum0[i+1]); printf("%d ",ans); fclose(stdin); fclose(stdout); return 0; }
T2
hash
若x,y的数码种类相同 则这个哈希值也相同
一个哈希值的个数为C(sum,2);
本来T成 加了register快的飞起
#include <iostream> #include <cstdio> #define N 1024 using namespace std; int n,cnt[N],pow2[10]={1,2,4,8,16,32,64,128,256,512}; long long ans; bool exist[10]; int Main() { freopen("number.in","r",stdin); freopen("number.out","w",stdout); cin>>n; for(register int i=1;i<=n;++i) { register int x=i,sum=0; while(x) { exist[x%10]=true; x/=10; } for(register int j=0;j<=9;++j) {if(exist[j]) sum+=pow2[j];exist[j]=false;} cnt[sum]++; } for(int i=0;i<N;++i) ans+=1ll*cnt[i]*(cnt[i]-1)/2; cout<<ans<<endl; fclose(stdin); fclose(stdout); return 0; } int sb=Main(); int main(int argc,char *argv[]) {;}
T3
贪心 使偶数项上的数尽量大,使奇数项上的数尽量小
#include <cstdio> #include <cctype> #define N 2000005 bool found; int n,k,flag,a[N],ls[N]; inline void read(int &x) { bool f=0;register char ch=getchar(); for(x=0;!isdigit(ch);ch=getchar()) if(ch=='-') f=1; for(;isdigit(ch);x=x*10+ch-'0',ch=getchar()); x=f?-x:x; } void alalbbalbbsgkldqn() { puts("hello ladies and gentlemen"); puts("i'm MC bytlxmdsyl"); puts("有一本书名叫天方夜谭"); puts("很奇妙又好看"); puts("叙述的是阿拉伯的故事"); puts("到处都在流传"); puts("由阿拉丁神灯"); puts("有辛巴达航海"); puts("one two three and four"); puts("come on yo let's go"); puts("这里有个神奇的故事"); puts("一个人 一个人"); puts("一个人的命运会改变"); puts("阿里 阿里巴巴"); puts("阿里巴巴是个快乐的青年"); puts("阿里 阿里巴巴"); puts("阿里巴巴是个快乐的青年"); } int main(int argc,char *argv[]) { freopen("wave.in","r",stdin); freopen("wave.out","w",stdout); read(n);read(k); for(int i=1;i<=n;++i) read(a[i]); printf("%d ",((n^(2^2^n&(1&1)))-((n^1)-((n+1)^1))+1)>>1); fclose(stdin); fclose(stdout); return 0; alalbbalbbsgkldqn(); }
#include<iostream> #include<cstdio> #include<cstring> #define N 2000007 using namespace std; int a[N]; int n,k,m,ans,cur; inline int read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int main() { n=read();k=read(); for(int i=0;i<n;i++) a[i]=read(); ans=1,m=0,cur=a[0]; for(int i=1;i<n;i++) { if(m) if(cur-a[i]>=k) m=0,ans++,cur=a[i]; else cur=max(cur,a[i]); else if(a[i]-cur>=k) m=1,ans++,cur=a[i]; else cur=min(cur,a[i]); } printf("%d ",ans); return 0; }