Codeforces Round \ # 108 (Div. 2) 경 혼 기

좋아, 인품 이 또 소모 되 었 으 니, rating 은 떨 어 지지 않 았 어.그런데 20 몇 점 밖 에 안 올 랐 어 요. 안 오 른 것 처럼.뭐 랄 까, 인 코딩 능력, 사고 선명 도 는 여전히 따라 가지 못 한다.cf 의 문 제 는 정말 좋 습 니 다. 알고리즘 이 없다 고 하지만 쉽게 풀 수 있 는 것 이 아니 라 항상 빙빙 돌려 야 합 니 다.
 
A. 하나의 vis 배열 로 모든 학생 들 이 한 번 만 기록 되 고 한 번 만 스 캔 하면 됩 니 다.하지만 손 을 떨 면 습관 적 으로 맵 [j] [i] 을 맵 [i] [j] 로 두 드 렸 다.5 분 여 를 낭비 하고 서 야 찾 았 다.
 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace  std;
char map[200][200];
bool vis[200];
int main(){
    int n,m,maxx,ans,i,j;
    while(scanf("%d%d",&n,&m)!=EOF){
        ans=0;
        memset(vis,0,sizeof(vis));
        for(i=0;i<n;i++){
            scanf("%s",map[i]);
        }
        for(i=0;i<m;i++){
            maxx=-1;
            for(j=0;j<n;j++){
                maxx=max((int)map[j][i],maxx);
            }
            for(j=0;j<n;j++){
                if(map[j][i]==maxx&&!vis[j]){
                    vis[j]=1;
                    ans++;
                }
            }
        }
        printf("%d
",ans); } return 0; }
 
 
B。생각 이 뚜렷 하지 도 않 은 데 코드 를 두 드 렸 더 니 이 문제 에 너무 많은 시간 이 걸 렸 다.이 문제 의 관건 은 방향 벡터 가 마이너스 이 고 플러스 이 며 0 이 며 걸 을 수 있 고 걸 을 수 없 으 며 x 방향 을 돌 보 느 냐 Y 방향 을 돌 보 느 냐 하 는 것 이다.나 는 문 제 를 보고 바로 손 에 넣 었 는데 A 를 빨리 할 수 있 을 것 같 았 다. 결국 1 시간 이 걸 려 서 야 풀 었 는데 마지막 에 자신의 문제 의 뜻 을 제대로 이해 하지 못 했다 는 것 을 알 게 되 었 다.다음 부 터 는 생각 이 분명 해 지면 손 을 써 야 한다.
 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace  std;
long long abs(long long a){
    if(a>0)return a;
    return -a;
}

long long solve(long long loc,long long n,long long dir){
    long long res=0,t;
    if(dir>0){
        t=n-loc;
        res=t/dir;
    }
    else{
        t=loc-1;
        res=t/(-dir);
    }
    return res;
}

int main(){
    long long n,m,x,y,i,j,a,b,k,ans,r,c,temp;
    while(cin>>n>>m){
        ans=0;
        cin>>x>>y;
        cin>>k;
        while(k--){
            cin>>a>>b;
            if(a==0&&b==0)continue;
            if(x+a>=1&&x+a<=n&&y+b>=1&&y+b<=m){
                if(a==0&&b==0)continue;
                if(a==0&&b!=0){
                    temp=solve(y,m,b);
                    ans+=temp;
                    y+=temp*b;
                    continue;
                }
                if(b==0&&a!=0){
                    temp=solve(x,n,a);
                    ans+=temp;
                    x+=temp*a;
                    continue;
                }
                r=solve(x,n,a);
                c=solve(y,m,b);
                if(r>=c){
                    x+=c*a;
                    y+=c*b;
                    ans+=c;
                }
                else{
                    x+=r*a;
                    y+=r*b;
                    ans+=r;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
 
 
c 문 제 는 매번 길이 가 l 인 접 두 사 를 교환 해 야 한다 고 말 하지만 우 리 는 첫 번 째 교환 l, 두 번 째 교환 l - 1 로 바 꿀 수 있다. 그러면 두 단어 와 두 번 째 자 모 를 임의로 교환 할 수 있다.그 다음은 간단 한 배열 조합 곱셈 원리 다.(왜 그런 지 모 르 겠 지만 이 문 제 는 위의 문제 보다 훨씬 간단 한 것 같다)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
bool vis[200];
char map[200][200];
long long num[200];
int main(){
    long long n,m,i,j,ans;
    while(cin>>n>>m){
        ans=1;
        for(i=0;i<n;i++){
            cin>>map[i];
        }
        memset(num,0,sizeof(num));
        for(i=0;i<m;i++){
            memset(vis,0,sizeof(vis));
            for(j=0;j<n;j++){
                if(!vis[map[j][i]]){
                    vis[map[j][i]]=1;
                    num[i]++;
                }
            }
        }
        for(i=0;i<m;i++){
            ans*=num[i];
            ans%=1000000007;
        }
        cout<<ans%1000000007<<endl;
    }
    return 0;
}
 

좋은 웹페이지 즐겨찾기