Codeforces Round #221 (Div. 2)

2014-11-24 07:22:10 · 作者: · 浏览: 0

A 题:

遍历一遍找到^的位置x。

然后从x往前一直到0,左杠杆转化为数字。

然后从x往后一直到len,右杠杆转化为数字。

然后进行比较。

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; #define INF 99999999 #define LL __int64 char str[1010001]; int main() { while(~scanf("%s",str)) { int len=strlen(str); int bb,i; bb=0; for(i=0;i
       
        =0;i--) { if(str[i]!='=') { sum1+=(bb-i)*(str[i]-'0'); } } for(i=bb+1;i
        
         sum2) { cout<<"left"<
         
          
B题:

如果A欠Bx元,那么A拥有的钱数-x,b拥有的钱数+x;

就这样处理完所有的欠钱关系,最后如果A拥有的钱数为正数y,那么说明最优的结果,除A以外的人应该共给A y钱。

#include 
           
            
#include 
            
              #include 
             
               #include 
              
                #include 
               
                 using namespace std; #define INF 99999999 #define LL __int64 char str[1010001]; int main() { int n,m,i,a,b,c; int num[1001]; while(~scanf("%d%d",&n,&m)) { memset(num,0,sizeof(num)); for(i=0;i
                
                 0)sum+=num[i]; } cout<
                 
                  
C题:

1689四个数字组成的所有组合对7取余可以得到0~6中的所有数字。

输入一个字符串,从这个字符串中挑出一个1,6,8,9来。

然后对剩下的数对7取余(大整数取余),然后加上1689四个数字组成的相应的序列。

比如说输入123456789。

123456789的其中一个结果为234571869。

234560000+1869=234571689

234560000%7==0;

1869%7==0;

那么234571689%7==0;

#include 
                   
                    
#include 
                    
                      #include 
                     
                       #include 
                      
                        #include 
                       
                         using namespace std; #define INF 99999999 #define LL __int64 char str[1010001]; int num[1010001]; char addstr[7][11]={ "1869","1968","1689","6198","1698","1986","1896" }; int main() { int n,m,i,a,b,c; while(~scanf("%s",str)) { int len=strlen(str); for(i=0;i
                        
                         =0;i--) { ss=ss*10+num[i]; ss=ss%7; } int lls=0; int leap=0; for(i=len-1;i>=4;i--) { if(num[i]==0&&leap==0) { lls++; } else { cout<
                         
                          
D题:

dp[l][r]=x: 代表有x行数字的l到r的范围内都为1。

那么结果sum=max(sum,dp[l][r]*(r-l+1));
对于某一行如果为0111101的话,

先把dp[2][5]++;dp[7][7]++;

对所有的行运算完成后,然后执行dp[l][r]=dp[l][r]+dp[l-1][r]+dp[l][r+1]-dp[l-1][r+1];

#include 
                           
                            
#include 
                            
                              #include 
                             
                               #include 
                              
                                #include 
                               
                                 #include
                                
                                  using namespace std; #define INF 99999999 #define LL __int64 char str[10000]; char addstr[7][11]={ "1869","1968","1689","6198","1698","1986","1896" }; int dp[5010][5010]; int num[5010]; int main() { int n,m,i,a,b,c,j,k; while(~scanf("%d%d",&n,&m)) { memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%s",str); for(j=1;j<=m;j++) { num[j]=str[j-1]-'0'; } for(j=1;j<=m;j++) { if(num[j]==1) { for( k=j+1;k<=m;k++) { if(num[k]==0)break; } dp[j][k-1]++; j=k-1; } } } for(i=1;i<=m;i++) { for(j=m;j>=i;j--) { dp[i][j]+=dp[i-1][j]; dp[i][j]+=dp[i][j+1]; dp[i][j]-=dp[i-1][j+1]; } } int sum; sum=0; for(i=1;i<=m;i++) { for(j=i;j<=m;j++) { sum=max(sum,(j-i+1)*dp[i][j]); } } cout<