Codeforces Round #296 (Div. 2)

A

题意:给出长为a,宽为b的纸片,每次以短边作为正方形的边长,问能够得到多少个正方形

先是直接整除个a/b,再用a%b,b作为新的纸片的长和宽,去进行同样的操作

 

自己做的时候= =模拟了除法的过程(用减法= =)发现超时,于是还特判了一下如果a/b>10000单独处理= =居然当时还过了

= = tle---tle---tle------

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<queue> 
 9 #include<algorithm>  
10 #define mod=1e9+7;
11 using namespace std;
12 
13 typedef long long LL;
14 
15 int main(){
16     LL a,b,ans=0;
17     cin>>a>>b;
18     while(1){
19         if(a<b) swap(a,b);
20         if(b==0) break;        
21         ans+=a/b;
22         LL tmp=a%b;
23         a=b;
24         b=tmp;
25     }
26     cout<<ans<<"\n";
27     return 0;    
28 }
View Code

 

 

B

题意:给出两个长度相同的字符串s,t,定义距离为两个字符串相应位置上字符不同的个数,问经过一次交换能够得到的最小距离,并输出交换的位置

用dp[a][b]分别将在相同位置上,s[i]和t[i]不同的位置记录下来,

如果dp[a][b]和dp[b][a]都存在,那么交换之后,刚好匹配,最大距离减去2 如果只有dp[a][b]存在,那么最大距离减去1

话说这一题,自己做的时候是一点思路都没有,好好学 这一题= =

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<queue> 
 9 #include<algorithm>  
10 #define mod=1e9+7;
11 using namespace std;
12 
13 typedef long long LL;
14 const int maxn=200005;
15 char s[maxn],t[maxn];
16 int dp[105][105];
17 int has[maxn];
18 
19 int main(){
20     int i,j,n,ans=0;
21     scanf("%d",&n);
22     cin>>(s+1)>>(t+1);
23     for(i=1;i<=n;i++){
24         if(s[i]!=t[i]){
25             dp[s[i]-'a'][t[i]-'a']=i;
26             has[s[i]-'a']=i;    
27             ans++;        
28         }
29     }
30     
31     for(i=0;i<26;i++){
32         for(j=0;j<26;j++){
33             if(dp[i][j]!=0&&dp[j][i]!=0){
34                 printf("%d\n",ans-2);
35                 printf("%d %d\n",dp[i][j],dp[j][i]);
36                 return 0;
37             }
38         }
39     }
40     
41     for(i=0;i<26;i++){
42         for(j=0;j<26;j++){
43             if(dp[i][j]!=0&&has[j]!=0){
44                 printf("%d\n",ans-1);
45                 printf("%d %d\n",dp[i][j],has[j]);
46                 return 0;
47             }
48         }
49     }
50     
51     printf("%d\n",ans);
52     printf("-1 -1\n");
53     return 0;    
54 }
View Code

 

 

 

C

题意:给出长为w,宽为h的玻璃,现在切割n刀,问每切一刀后,最大的玻璃碎片的面积

因为每次一刀下去,当前的区间都会被分成2份,那么为了使面积最大,从当前的横向区间里面选最大的长,从当前的竖向区间里面取最大的宽

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<queue> 
 9 #include<set>
10 #include<algorithm>  
11 #define mod=1e9+7;
12 using namespace std;
13 
14 typedef long long LL;
15 multiset<int> hh,vv;
16 set<int >ph,qv;
17 set<int>::iterator r,l;
18 
19 int main(){
20     char c;
21     int x,w,h,n;
22     scanf("%d%d%d",&w,&h,&n);getchar();
23     ph.insert(0);ph.insert(h);
24     qv.insert(0);qv.insert(w);
25     hh.insert(h);vv.insert(w);
26     
27     while(n--){
28         scanf("%c %d",&c,&x);getchar();
29         
30         if(c == 'H')
31         {
32             l = ph.lower_bound(x);
33             r = l; l--;
34             ph.insert(x);
35             hh.insert(x-(*l));
36             hh.insert((*r)-x);
37             hh.erase(hh.find((*r) - (*l)));
38         }
39         else
40         {
41             l = qv.lower_bound(x);
42             r = l; l--;
43             qv.insert(x);
44             vv.insert(x - (*l));
45             vv.insert((*r) - x);
46             vv.erase(vv.find((*r) - (*l)));
47         }
48 
49         printf("%I64d\n", (long long)(*hh.rbegin()) * (*vv.rbegin()));
50         
51         
52     }    
53     return 0;            
54 }
View Code


 

用数组写的,超时了,然后看的题解,用的STL里面的东西,真是太不熟悉太不熟悉了

 

 

 

 

go---go---go----

 

posted @ 2015-03-20 01:17  sequenceaa  阅读(145)  评论(0编辑  收藏  举报