源链接: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;
}