CodeForces - 1368

    技术2022-07-11  108

    CodeForces - 1368

    A - C+=

    直接模拟 ll t,a,b,n; int main() { scanf("%lld",&t); while(t--) { int num=0; scanf("%lld%lld%lld",&a,&b,&n); while(a<=n&&b<=n) { ll minn=min(a,b); ll maxx=max(a,b); a=minn+maxx; b=maxx; num++; } W(num); } return 0; }


    B - Codeforces Subsequences

    一共10个字母,假设他们的个数分别为 a 0 , a 1 . . . a_0,a_1... a0,a1... k = a 0 a 1 . . . a 9 k=a_0a_1...a_9 k=a0a1...a9 可以证明 个数越平均越好 直接枚举

    int ans[10]; ll k; ll qpow(ll a,ll b){ll res=1;while(b){if (b&1)res*=a;a*=a;b>>=1;}return res;} int main() { scanf("%lld",&k); for (ll j=1;j<=100;j++) { for (ll i=10;i>=0;i--) { if (qpow(j,i)*qpow(j+1,10-i)>=k) { rep(q,0,i-1)ans[q]=j; rep(q,i,9)ans[q]=j+1; rep(i,1,ans[0])printf("%c",'c'); rep(i,1,ans[1])printf("%c",'o'); rep(i,1,ans[2])printf("%c",'d'); rep(i,1,ans[3])printf("%c",'e'); rep(i,1,ans[4])printf("%c",'f'); rep(i,1,ans[5])printf("%c",'o'); rep(i,1,ans[6])printf("%c",'r'); rep(i,1,ans[7])printf("%c",'c'); rep(i,1,ans[8])printf("%c",'e'); rep(i,1,ans[9])printf("%c",'s');puts(""); return 0; } } } }


    C - Even Picture

    构造方法:用正方形去覆盖 例如n=3 1 1 1 1 1 1 1 1 1 1 1 1 1 int n; int main() { scanf("%d",&n); W(4+3*n); rep(i,0,n+1)printf("%d %d\n",i,i); rep(i,0,n)printf("%d %d\n",i,i+1); rep(i,0,n)printf("%d %d\n",i+1,i); return 0; }


    D - AND, OR and square sum

    先观察几组例子: 40100 91001 操作之后得到: 00000 131101 30011 50101 操作之后得到 10001 70111 可以发现,操作相当于只是交换了某些位,但和是不变的,即x+y=K(定值) 在坐标系中做图可以证明x^2+y^2在x=y时取得最小,在x=K或y=K时取得最大值 因此贪心策略是尽量构造极端数字 先记录下位的位置为1的数量,然后去构造“极端的数”,构造n个这样的数即可 int n; ll a[maxn],num[30],ans=0; int main() { scanf("%d",&n); rep(i,1,n) { scanf("%lld",&a[i]); rep(j,0,20)if (a[i]&(1<<j))num[j]++; } rep(i,1,n) { ll sum=0; for (int j=20;j>=0;j--) { if (num[j]) { num[j]--; sum+=(1<<j); } } ans+=sum*sum; } WW(ans); return 0; }
    Processed: 0.009, SQL: 9