1. 程式人生 > >【刷題】AtCoder Regular Contest 001

【刷題】AtCoder Regular Contest 001

etc 無法 給定 完全 形式 要求 \n 如果 max

A.センター採點

題意:給一個只包含1234的字符串,求出現次數最多和最少的字符

做法:還能怎麽做。。。

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
#define REP(a,b,c) for(register int a=(b),a##end=(c);a<=a##end;++a)
#define DEP(a,b,c) for(register int a=(b),a##end=(c);a>=a##end;--a)
const int MAXN=100+10;
int n,Mx,Mn,sum[5];
char s[MAXN];
template<typename T> inline void read(T &x)
{
    T data=0,w=1;
    char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')w=-1,ch=getchar();
    while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
    if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
int main()
{
    read(n);scanf("%s",s);Mx=0;Mn=n;
    REP(i,0,n-1)sum[s[i]-'0']++;
    REP(i,1,4)chkmax(Mx,sum[i]),chkmin(Mn,sum[i]);
    printf("%d %d\n",Mx,Mn);
    return 0;
}

B.リモコン

題意:給定初始溫度,每次操作可以改變1度、5度或10度,問變成要求溫度的最小操作次數

做法:由於數據範圍太小,於是直接枚舉就好了。如果數據範圍大的話,可以做一個有負權的背包。

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
#define REP(a,b,c) for(register int a=(b),a##end=(c);a<=a##end;++a)
#define DEP(a,b,c) for(register int a=(b),a##end=(c);a>=a##end;--a)
const int inf=0x3f3f3f3f;
int L,R,n,ans=inf;
template<typename T> inline void read(T &x)
{
    T data=0,w=1;
    char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')w=-1,ch=getchar();
    while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
    if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
int main()
{
    read(L);read(R);n=abs(R-L);
    REP(i,-4,4)REP(j,-8,8)REP(k,-40,40)if(i*10+j*5+k==n)chkmin(ans,abs(i)+abs(j)+abs(k));
    write(ans,'\n');
    return 0;
}

C.パズルのお手伝い

題意:棋盤確定了一些位置,問能不能擺成八皇後形式

做法:搜索。而且有可能一開始輸進來的局面就不合法,我被這個坑到了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
#define REP(a,b,c) for(register int a=(b),a##end=(c);a<=a##end;++a)
#define DEP(a,b,c) for(register int a=(b),a##end=(c);a>=a##end;--a)
int row[10],dia[2][20],line[10];
char s[10];
template<typename T> inline void read(T &x)
{
    T data=0,w=1;
    char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')w=-1,ch=getchar();
    while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
    if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void print()
{
    REP(i,1,8)
    {
        REP(j,1,8)
            if(line[i]==j)putchar('Q');
            else putchar('.');
        putchar('\n');
    }
}
inline void dfs(int x)
{
    if(x>8)print(),exit(0);
    if(line[x])dfs(x+1);
    else
        REP(i,1,8)if(!row[i]&&!dia[0][x+i]&&!dia[1][x-i+8])
        {
            line[x]=i;
            row[i]=dia[0][x+i]=dia[1][x-i+8]=1;
            dfs(x+1);
            line[x]=row[i]=dia[0][x+i]=dia[1][x-i+8]=0;
        }
}
int main()
{
    REP(i,1,8)
    {
        scanf("%s",s+1);
        REP(j,1,8)if(s[j]=='Q')
        {
            if(line[i]||row[j]||dia[0][i+j]||dia[1][i-j+8])
            {
                puts("No Answer");
                return 0;
            }
            else line[i]=j,row[j]=dia[0][i+j]=dia[1][i-j+8]=1;
        }
    }
    dfs(1);
    puts("No Answer");
    return 0;
}

D.レースゲーム

題意:給兩條貫穿上下的折線,問從最下方一個點保證在兩條折線中間走到最上方一個點的最小距離

做法:一個想法是先確定好每層要走到的點,答案就可以直接算。但是,由於每層中間部分的不確定,所以無法直接確定每層走到的點。但是我們向上走只有兩種偏向,向左或向右。所以我們記錄從當前點向左和向右走的路徑,不斷向上掃,如果出現某一層的區間完全在上一區間的左邊,那麽這次肯定走到上一區間的左端點;反之右端點。一直走上去就是正確路線了。

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
#define REP(a,b,c) for(register int a=(b),a##end=(c);a<=a##end;++a)
#define DEP(a,b,c) for(register int a=(b),a##end=(c);a>=a##end;--a)
const int MAXN=200000+10;
int n,st,ed,l[MAXN],r[MAXN];
std::pair<db,db> L,R,now,nL,nR;
db ans;
template<typename T> inline void read(T &x)
{
    T data=0,w=1;
    char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')w=-1,ch=getchar();
    while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
    if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
#define x first
#define y second
inline db hypot(std::pair<db,db> A)
{
    return sqrt(A.x*A.x+A.y*A.y);
}
inline db cross(std::pair<db,db> A,std::pair<db,db> B)
{
    return A.x*B.y-A.y*B.x;
}
int main()
{
    read(n);read(st);read(ed);n++;st++;ed++;
    REP(i,1,n)read(l[i]),read(r[i]),l[i]++,r[i]++;
    l[1]=r[1]=st;
    l[n]=r[n]=ed;
    now=std::make_pair(st,1);
    for(register int i,j;j<=n;)
    {
        i=now.y+1,j=i+1;
        L=std::make_pair((db)(l[i]-now.x),(db)(i-now.y));
        R=std::make_pair((db)(r[i]-now.x),(db)(i-now.y));
        while(j<=n)
        {
            nL=std::make_pair((db)(l[j]-now.x),(db)(j-now.y));
            nR=std::make_pair((db)(r[j]-now.x),(db)(j-now.y));
            if(cross(R,nL)<0)
            {
                ans+=hypot(R);
                now=std::make_pair(now.x+R.x,now.y+R.y);
                break;
            }
            if(cross(L,nR)>0)
            {
                ans+=hypot(L);
                now=std::make_pair(now.x+L.x,now.y+L.y);
                break;
            }
            if(cross(R,nR)>0)R=nR;
            if(cross(L,nL)<0)L=nL;
            ++j;
        }
    }
    ans+=hypot(std::make_pair((db)ed-now.x,(db)n-now.y));
    printf("%.14f\n",ans);
    return 0;
}

【刷題】AtCoder Regular Contest 001