cf_296(Div2)

源链接:http://codeforces.com/contest/527

A:模拟,画下图就知道了。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<limits.h>
#include<map>
//#define ONLINE_JUDGE
#define eps 1e-8
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI=acos(-1.0);
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
using namespace std;
#define ll __int64
int n,m;
int L,R,C;
#define Mod 1000000007
#define N 510
#define M 1000100
int dirx[4] = {0,0,1,-1};
int diry[4] = {1,-1,0,0};
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);
#endif
    ll a,b;
    while(scanf("%I64d%I64d",&a,&b)!=EOF){
        ll ans = 0;
        while(a !=0 && b!=0){
            if(a<b)
                swap(a,b);
            ans += (a/b);
            a -= (a/b)*b;
        }
        printf("%I64d\n",ans);
    }
return 0;
}

B:这道题挺不错的。我们首先知道,假设s,t两个字符串不通的地方为ans,那么最终答案也就是ans,ans-1和ans-2这三种情况,对于两个字符串相对位置上字符相同的,那是肯定不能换的,换的只能是相对不同的,那么我们就将不同字符在哪个地方不同记录下来,比如

abcde

adcbe

那么 mp[b][d] = 2,mp[d][b] = 4,这样,互换2,4位置的,就可以使得ans-2,而我们可以发现此时 mp[b][d]>0&&mp[d][b]>0

又假如

abcde

adcfe

那么mp[b][d]=2,mp[d][f]=4,这样,互换2,4位置,就可以使得ans-1,而我们发现此时 mp[b][d]>0&&mp[d][f]>0

这样子就可以做了。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<limits.h>
#include<map>
//#define ONLINE_JUDGE
#define eps 1e-8
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI=acos(-1.0);
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
using namespace std;
#define ll __int64
int n,m;
int L,R,C;
#define Mod 1000000007
#define N 510
#define M 1000100
int dirx[4] = {0,0,1,-1};
int diry[4] = {1,-1,0,0};
char s[M];
char t[M];
int vis[30][30];
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);
#endif
    ll a,b;
    while(sf(n)!=EOF){
        int ans = 0;
        sfs(s);
        sfs(t);
        memset(vis,0,sizeof vis);
        for(int i=0;i<n;i++){
            if(s[i] != t[i]){
                vis[s[i]-'a'][t[i]-'a'] = i+1;
                ans++;
            }
        }
        int flag = 0;
        for(int i=0;i<26;i++){
            for(int j=0;j<26;j++){
                if(vis[i][j] && vis[j][i]){
                    printf("%d\n",ans-2);
                    printf("%d %d\n",vis[i][j],vis[j][i]);
                    flag = 1;
                    break;
                }
            }
            if(flag) break;
        }
        if(flag) continue;

        for(int i=0;i<26;i++){
            for(int j=0;j<26;j++){
                for(int k=0;k<26;k++){
                    if(vis[i][j] && vis[j][k]){
                        printf("%d\n",ans-1);
                        printf("%d %d\n",vis[i][j],vis[j][k]);
                        flag = 1;
                        break;
                    }
                }
                if(flag) break;
            }
            if(flag)
                break;
        }
        if(!flag){
            printf("%d\n",ans);
            printf("-1 -1\n");
        }
    }
return 0;
}

C:有一个h*w的矩形,每次横着或者竖着在某个地方切下去,问每次切完后,面积最大的矩形是多少?

这道题目用set可以做,我们用两个set来保存横着和竖着切的位置,再用两个multiset来保存切完后所有横着和竖着的长度,每输入一个位置,我们先在set里面找到大于它的第一个位置,然后再找到小于它的第一个位置,然后,把位置放入set,放进去后,multiset中的长度就得更新了,分别更新为 输入的位置-小于它的第一个位置 和 大于它的第一个位置-输入的位置,然后删去 大于它的第一个位置-小于它的第一个位置(因为这个长度被输入的位置分割了)。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<limits.h>
#include<set>
#include<map>
//#define ONLINE_JUDGE
#define eps 1e-8
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI=acos(-1.0);
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
using namespace std;
#define ll __int64
//int n,m;
#define Mod 1000000007
#define N 510
#define M 1000100
int dirx[4] = {0,0,1,-1};
int diry[4] = {1,-1,0,0};
char s[M];
char t[M];
int vis[30][30];
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);
#endif
    ll w,h,n;
    while(scanf("%I64d%I64d%I64d",&w,&h,&n)!=EOF){
        set<ll> cw,ch;  //store the cut length
        multiset<ll> wl,hl; //store the remainning length
        cw.insert(0),cw.insert(w);
        ch.insert(0),ch.insert(h);
        wl.insert(w),hl.insert(h);
        set<ll>::iterator l,r;
        getchar();
        char op;
        ll x;
        for(int i=0;i<n;i++){
            scanf("%c %I64d",&op,&x);
            getchar();
            if(op == 'H'){
                l = ch.lower_bound(x);//找到大于x的第一个位置
                r = l;<span style="white-space:pre">		</span>//r是大于x的第一个位置
                l--;<span style="white-space:pre">		</span>//l变为小于x的第一个位置
                ch.insert(x);<span style="white-space:pre">	</span>//插入x
                hl.insert(x-(*l));<span style="white-space:pre">	</span>//被分割的左边长度
                hl.insert((*r)-x);<span style="white-space:pre">	</span>//被分割的右边长度
                hl.erase(hl.find((*r)-(*l)));<span style="white-space:pre">	</span>//删去这个长度(注意使用方法erase删去的是迭代器,hl.find()就能返回一个迭代器)
            }else{
                l = cw.lower_bound(x);
                r = l;
                l--;
                cw.insert(x);
                wl.insert(x-(*l));
                wl.insert((*r)-x);
                wl.erase(wl.find((*r)-(*l)));
            }
            printf("%I64d\n",(*hl.rbegin())*(*wl.rbegin()));//rbegin()能返回末尾元素,即最大的长度*最大的宽度
        }
    }
return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值