1. 程式人生 > 實用技巧 >ACM-東北賽划水記

ACM-東北賽划水記

今天東北賽,滑了一天水,做了幾道題。

T8:

  1. 題意:字串壓縮

SOL:優先壓縮長度,再選字典序最優。注意可能對長度有貢獻的數字1 2 16 16*16 16*16*16......

把這些點記錄下來,再對每個點進行嘗試,判斷去掉一個字元後對字典序的貢獻是減少還是增加,如果有減少的點,選減少的最前面的那個點,不然就選增加的最後一個點。

#include<bits/stdc++.h>
#define N 1000007
using namespace std;
int t[17],len,tag,c[N],ta[N],sb,sb1,sb2,ff1[N],ff2[N];
char
p[N],s[N]; bool get_ab() { for (int i=1;i<=tag;i++) { for (int j=1;j<=6;j++) if (c[i]==t[j]) {ta[++sb]=i; break;} } return sb!=0; } void out(int x) { if (x==0) return; out(x/16); x=x%16; if (0<=x&&x<10) putchar(48+x); else putchar(55+x); } signed main () { t[
1]=1; t[2]=2; t[3]=16; t[4]=256; t[5]=4096; t[6]=65536; while (scanf("%s",s+1)!=EOF) { len=strlen(s+1); tag=0; sb=0; for (int i=1;i<=len;i++) { if (s[i]==s[i-1]) c[tag]++; else p[++tag]=s[i],c[tag]=1; } if (get_ab()) { sb1=sb2=0;
for (int i=1;i<=sb;i++) { if (c[ta[i]]==1) { if (p[ta[i]]>p[ta[i]+1]) ff1[++sb1]=ta[i]; else ff2[++sb2]=ta[i];} if (c[ta[i]]==2) { ff2[++sb2]=ta[i];} if (c[ta[i]]>2) { ff2[++sb2]=ta[i];} } if (sb1!=0) c[ff1[1]]--; else c[ff2[sb2]]--; } else {c[1]--;} for (int i=1;i<=tag;i++) { if (c[i]==0) continue; if (c[i]==1) { putchar(p[i]); continue;} putchar(p[i]); out(c[i]); } putchar('\n'); } }
View Code

T10

可以發現,如果n充分大,那麼對於y同奇偶的點,選定一個點的顏色,其他都唯一確定了。 所以2個自由元,答案為4

n比較小的時候寫暴力觀察即可。

T5

咋一看像線性基,其實不是

對於k是奇數,可以發現選後k+1位分別選一位為0即可。

對於偶數,認真觀察(瞎幾把猜)可以發現是無解的(不會證明)

#include<bits/stdc++.h>
using namespace std;
long long f[73];int T,n,k;
signed main () {
    scanf("%d",&T);
    while (T--) {
        scanf("%d%d",&n,&k);
        if (n==1&&k==1) {puts("1"); continue;}
        if (n==k||k==0) {puts("-1"); continue;}
        if (k%2==1) {
        for (int i=1;i<=k+1;i++) 
          f[i]=(1ll<<k+1)-1ll-(1ll<<(k+1-i));
        for (int i=k+2;i<=n;i++) f[i]=(1ll<<i-1)+(1ll<<k-1)-1ll;
        for (int i=1;i<n;i++) printf("%lld ",f[i]); printf("%lld\n",f[n]); 
        } else {
            puts("-1"); continue;
        }
    }
}
View Code

T13

水題,不多bb

Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include<bits/stdc++.h>
using namespace std;
int  p[1000007];
void t(int x){
    if (x<1||x>1000000) return;
    p[x]=1;
}
int T,x;
signed main () {
    p[1]=1;
    for (int i=1;i<=1000000;i++) 
     if (p[i]) { 
         t(i*5+13);
         t(i*5-13);
         t(i*13-5);
         t(i*13+5);
     }
    scanf("%d",&T);
    while (T--) {
        scanf("%d",&x);
//        if (x>)
        puts(p[x]?"Yes":"No");
    }
}
View Code