Codeforces Round #423 (Div. 2)A-B-C-D 日常訓練打卡

題目鏈接:CF423

感覺自己寫了4個模擬。==

A題

坑點:要注意一個組只有一個人的時候,他的入座順序,是優先選擇單桌,然後兩人空桌,然後兩人桌其中有一個位置被佔的桌子。讀了好幾遍都理解錯了。

然後對一人組和兩人組分別討論,兩人組很簡單,只坐空兩人桌。一人組就按照上面的順序寫就好,用兩個指針,指向桌子,這就不會超時。

AC代碼:

/*2017年11月23日09點27分
AC*/
#include<stdio.h>
#include<string.h>
const int maxn=2e5+10;
int t[maxn];
int bs[maxn];
int main(){
    int n,a,b;
    int pos1=0,pos2=0,lp2=0;
    scanf("%d%d%d",&n,&a,&b);
    for(int i=0;i<n;i++){
        scanf("%d",&t[i]);
    }
    memset(bs,0,sizeof(bs));
    int ans=0;
    for(int k=0;k<n;k++){
        if(t[k]==1){
            bool fs=false;
            if(a>=1){
                a--;
                fs=1;
            }else{
                //pos2=pos1;
               // bool fs=false;
                while(bs[pos2]!=0&&pos2<b){
                    pos2++;
                }
                if(pos2<b){
                    bs[pos2]=1;
                    //printf("%d\n",pos2);
                    fs=1;
                }else{
                    while(bs[pos1]!=1&&pos1<b){
                        pos1++;
                    }
                  // printf("%d\n",pos1);
                    if(pos1<b){
                        bs[pos1]=2;
                      //  printf("%d\n",pos1);
                        fs=1;
                    }
                }
            }
            if(!fs) ans++;//printf("*%d\n",k);
        }else if(t[k]==2){
            bool fs=false;
            while(bs[lp2]!=0&&lp2<b){
                lp2++;
            }
            if(lp2<b){
                bs[lp2]=2;
                fs=1;
            }
            if(!fs) ans+=2;//printf("*%d\n",k);
        }
    }
    printf("%d\n",ans);
    return 0;
}

B 題:

坑點:注意輸出-1的情況有哪些。以及有解的情況有哪些。找一下四個邊界。

AC代碼:

/*2017年11月21日
19點25分
AC*/
#include<stdio.h>
const int maxn=110;
char mp[maxn][maxn];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%s",mp[i]+1);
    }
    int numb=0,numw=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(mp[i][j]=='B') numb++;
            else numw++;
        }
    }
 //   printf("%d %d\n",numb,numw);
    if(numb==0){
        printf("1\n");
    }else if(numw==0&&n!=m){
        printf("-1\n");
    }else if(numw==0&&n==m){
        printf("0\n");
    }
    else{
        int ox=110,bx=-1,ly=110,ry=-1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(mp[i][j]=='B'){
                    if(i<ox) ox=i;
                    if(i>bx) bx=i;
                    if(j<ly) ly=j;
                    if(j>ry) ry=j;
                }
            }
        }
        int need=0;
        for(int i=ox;i<=bx;i++){
            for(int j=ly;j<=ry;j++){
                if(mp[i][j]=='W') need++;
            }
        }
        //printf("%d\n",need);
        //printf("%d %d %d %d \n",ly,ry,ox,bx);
        int len=bx-ox+1,wid=ry-ly+1;
      //  printf("%d %d\n",len,wid);
        if((len)==(wid)) printf("%d\n",need);
        else{
            if(len<wid){
                int delta=wid-len;
                if(ox-delta<1&&bx+delta>n&&(len+delta)>n) printf("-1\n");
                else printf("%d\n",need+(delta*wid));
            }
            else{
                int delta=len-wid;
                if(ly-delta<1&&ry+delta>m&&(wid+delta)>m) printf("-1\n");
                else printf("%d\n",need+(delta*len));
               // printf("%d\n",delta);
            }
        }
    }
    return 0;
}

C題:

代碼參考別人的。自己寫的MLE 了,注意最長字符串長度2e6.也是一個模擬。注意重合的情況要從哪一位開始複製。

AC代碼:

#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=2e6+10;
int main(){
    int n;
    scanf("%d",&n);
    char a[maxn]={};
    for(int i=0;i<n;i++){
        string s;
        int k;
        cin>>s>>k;
        int len=s.length();
        int pos1,pos2=-len;
        for(int j=0;j<k;j++){
            scanf("%d",&pos1);
            for(int i=max(0,pos2+len-pos1);i<len;i++){
                a[i+pos1]=s[i];
            }
            pos2=pos1;
        }

    }
    int i,j;
    for(i=maxn-1;a[i];i--);
    for(j=i;!a[j];j--);
    for(int k=1;k<=j;k++){
        if(!a[k])  a[k]='a';
            //printf("a");
#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    if(k==2){
        printf("%d\n",n-1);
        for(int i=1;i<=n-1;i++){
            printf("%d %d\n",i,i+1);
        }
    }else if(k==n-1){
        printf("2\n");
        for(int i=1;i<n;i++){
            printf("1 %d\n",i+1);
        }
    }else{
        //cout<<"**"<<endl;
        int nn=n-1;
        int kn=nn/k;
        int pn=nn%k;
        int ckn=kn;
        //printf("%d %d %d\n",kn,pn,pn+kn);
        if(pn==0){
            printf("%d\n",kn*2);
        }
        else if(pn==1){
            printf("%d\n",kn*2+1);
        }
        else if(pn>1){
            printf("%d\n",(kn+1)*2);
        }
        int id=2;
        for(int i=1;i<=k;i++){
            if(pn>0){
                pn--;
                int pre=1;
                //(kn+pn)
                for(int j=1;j<=ckn+1;j++){
                    printf("%d %d\n",pre,id);
                    pre=id;
                    id++;
                }
            }else{
                int pre=1;
                for(int j=1;j<=kn;j++){
                    printf("%d %d\n",pre,id);
                    pre=id;
                    id++;
                }
            }
        }
    }
	return 0;
}

// else printf("%c",a[k]); // putchar(a[k]?a[k]:'a'); } printf("%s\n",a+1);return 0;}


D題:

K個葉子節點=度爲1的節點。

然後畫圖找規律。

思路參考:http://blog.csdn.net/a912952381/article/details/75041963

然後我自己花了幾個,推了一下規律,還真過了哈哈……

AC代碼:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章