CTU 2011/CTU 2012 部分题解...

56 篇文章 0 订阅
29 篇文章 0 订阅
                题目、数据、标程、解题报告(捷克语): 
                          CTU2011   
                          CTU2012 

Collatz Conjecture
                题意:
                         有这么一个运算: f(x)= 1、当x为偶数 x/2   , 2、当x为奇数 x*3+1 。现在保证2^58内的数都可以通过这种运算最终到达1...现在给出两个数A,B问最先出来相同的数十什么..A是什么时候变成的..B是什么时候变成的...
                题解:
                         暴力枚举就好.关键是Hash...手写了一个Hash类..实际上就是模了一个数后..若同一个位置有多个数..则挂链表...
Program:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define oo 1<<29
#define pi acos(-1.0)
#define MAXN 22341 
using namespace std;   
struct HASH
{
       struct node
       {
               ll x,step,next;
       }P[MAXN*100];
       int ne,_next[MAXN+5];
       void initial()
       {
               ne=0;
               memset(_next,0,sizeof(_next));
       }
       void insert(ll x,ll step)
       {
               ll t=x%MAXN;
               P[++ne].next=_next[t],_next[t]=ne,P[ne].x=x,P[ne].step=step;
       }
       ll find(ll x)
       {
               ll t=x%MAXN;
               for (t=_next[t];t;t=P[t].next)
                  if (P[t].x==x) return P[t].step;
               return -1;
       }
}HA,HB;
int main()
{   
       ll A,B,a,b,step;  
       while (~scanf("%lld%lld",&a,&b) && a)
       {
                A=a,B=b,HA.initial(),HB.initial();
                step=0,HA.insert(A,0),HB.insert(B,0); 
                while (HA.find(B)<0 && HB.find(A)<0)
                { 
                        step++;
                        if (B!=1) 
                        {
                               if (B%2) B=B*3+1;
                                   else B=B/2;
                               HB.insert(B,step); 
                        }
                        if (A!=1)
                        {
                               if (A%2) A=A*3+1;
                                   else A=A/2;
                               HA.insert(A,step); 
                        } 
                }
                ll A0t,A1t,B0t,B1t,M;
                A0t=A1t=B0t=B1t=oo;
                if (HB.find(A)>=0) A0t=step,B0t=HB.find(A),M=A;
                if (HA.find(B)>=0) A1t=HA.find(B),B1t=step;
                if (A0t+B0t>A1t+B1t) swap(A0t,A1t),swap(B0t,B1t),M=B;
                printf("%lld needs %lld steps, %lld needs %lld steps, they meet at %lld\n",a,A0t,b,B0t,M);
       } 
       return 0;
}

Text Encryption
                题意:
                         现在要对字符串进行转换.转换方式是按照所给的串重新构造一个串..首先这个串不含空格和小写字母(所有的字母转化为大写)给定一个数M..第一次将%M=0的从0开始放好..接着再将%M=1从M开始放好..依次将所有的字符放好..
                题解:
                         直接模拟..
Program:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define oo 1<<29
#define pi acos(-1.0)
#define MAXN 1005 
using namespace std;
char ss[MAXN],s[MAXN],ans[MAXN];
int main()
{   
       int M,i,t,p,len,L; 
       while (~scanf("%d",&M) && M)
       { 
                memset(s,0,sizeof(s));
                gets(ss);
                gets(ss),len=strlen(ss),L=0;
                for (i=0;i<len;i++)
                {
                      if (ss[i]==' ') continue;
                      if (ss[i]>='a' && ss[i]<='z') s[L++]=ss[i]-'a'+'A';
                                              else  s[L++]=ss[i];
                }
                len=L;
                memset(ans,0,sizeof(ans)),i=0;
                for (p=0;p<len;p++)
                if (s[p]!=' ')
                {
                       if (ans[p]) break;
                       t=p;
                       while (t<len && i<len)
                       { 
                               ans[t]=s[i];
                               t+=M,i++;
                       }
                }
                puts(ans);
       } 
       return 0;
}
 

Invasion
                题意:
                         给了一个无相图(不超过10000个点...100000条边)...现在外星人要在某些点上建立据点..而距离据点距离小于 K的点就不能生存了..现在给出无向图..再以此给出M个外星人到来的顺序..请输出每个外星人到达后..还有多少个点可以生存...
                题解:
                         基本上裸的SPFA...只是dis数组只要初始化一次就好...
Program:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define oo 1<<29
#define pi acos(-1.0)
#define MAXN 10005
#define MAXM 200005
using namespace std;  
struct node
{
       int v,d,next;
}edge[MAXM];
int ne,_next[MAXN];
void addedge(int u,int v,int d)
{
       edge[++ne].next=_next[u],_next[u]=ne;
       edge[ne].v=v,edge[ne].d=d;
}
bool f[MAXN],inQ[MAXN];
int dis[MAXN];
queue<int> Q;
int SPFA(int u,int d)
{
       int ans=0,v,k;
       while (!Q.empty()) Q.pop();
       memset(inQ,false,sizeof(inQ));
       Q.push(u),dis[u]=0;
       while (!Q.empty())
       {
              u=Q.front(),Q.pop(),inQ[u]=false;
              if (dis[u]>=d) continue;
              if (!f[u]) f[u]=true,ans++;
              for (k=_next[u];k;k=edge[k].next)
              {
                       v=edge[k].v;
                       if (dis[v]==-1 || dis[v]>dis[u]+edge[k].d)
                       {
                                 dis[v]=dis[u]+edge[k].d;
                                 if (!inQ[v]) inQ[v]=true,Q.push(v);
                       }
              }
       }
       return ans;
}
int main()
{  
       int N,M,A,K,u,v,d,ans; 
       while (~scanf("%d%d%d%d",&N,&M,&A,&K) && N)
       {
                 ne=0,memset(_next,0,sizeof(_next));
                 while (M--)
                 {
                        scanf("%d%d%d",&u,&v,&d);
                        addedge(u,v,d),addedge(v,u,d);
                 }
                 memset(f,false,sizeof(f)),ans=N;
                 memset(dis,-1,sizeof(dis));
                 while (A--)
                 {
                        scanf("%d",&u);
                        ans-=SPFA(u,K);
                        printf("%d\n",ans);
                 }                 
                 printf("\n");
       }
       return 0;
}

Intergalactic Mortgage
                题意:
                         现在找银行贷款了X元..每年利率为r%(会利滚利)..现在每个月还银行Y元..问N年后..能否还清贷款..
                题解:
                         推出公式:  Xn=(X0+Y/-r/1200)*(1+r)^(12*n)...只要判断Xn的正负即可...(r=0单独讨论)...非常暴力..次方这么多居然还有精度..
Program:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define oo 1<<29
#define pi acos(-1.0)
#define eps 1e-11
#define MAXN 1005 
using namespace std;
int main()
{
       int n,i;
       double x,y,r,A,F;     
       while (~scanf("%lf%lf%d%lf",&x,&y,&n,&r) && n)
       {
               if (abs(r)<eps) 
               {
                    y=n*12*y;
                    x-=y;
                    if (x<eps) printf("YES\n");
                          else printf("NO\n");
               }else
               {   
                    r=r/1200,n*=12;
                    A=1+r,F=y/(-r);
                    x=(x+F)*pow(A,n)-F;
                    if (x<eps) printf("YES\n");
                         else  printf("NO\n");   
               }
       }
       return 0;
}

Ambiguous Result
                题意:
                         给出一个表达式..只有+与*号..现在可以任意加括号..问能得到的最小值和最大值分别是多少..
                题解:
                         简单的区间DP
Program:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define oo 1<<29
#define pi acos(-1.0)
#define MAXN 105
using namespace std;
ll dp[MAXN][MAXN][2],tp[MAXN],h[MAXN];
void dfs(int l,int r)
{
       if (l==r) 
       {
               dp[l][r][0]=dp[l][r][1]=h[l];
               return;
       }
       if (r-1==l)
       {
               if (!tp[l]) dp[l][r][0]=dp[l][r][1]=h[l]+h[r];
                     else  dp[l][r][0]=dp[l][r][1]=h[l]*h[r];
               return;
       } 
       for (int mid=l;mid<r;mid++)
       {
               if (dp[l][mid][0]==-1) dfs(l,mid);
               if (dp[mid+1][r][0]==-1) dfs(mid+1,r);
               if (!tp[mid])
               {
                      if (dp[l][r][0]<0 || dp[l][r][0]>dp[l][mid][0]+dp[mid+1][r][0])
                                           dp[l][r][0]=dp[l][mid][0]+dp[mid+1][r][0];
                      if (dp[l][r][1]<0 || dp[l][r][1]<dp[l][mid][1]+dp[mid+1][r][1])
                                           dp[l][r][1]=dp[l][mid][1]+dp[mid+1][r][1];
               }else
               {
                      if (dp[l][r][0]<0 || dp[l][r][0]>dp[l][mid][0]*dp[mid+1][r][0])
                                           dp[l][r][0]=dp[l][mid][0]*dp[mid+1][r][0];
                      if (dp[l][r][1]<0 || dp[l][r][1]<dp[l][mid][1]*dp[mid+1][r][1])
                                           dp[l][r][1]=dp[l][mid][1]*dp[mid+1][r][1];                       
               }
       }
}
char s[1<<16]; 
int main()
{ 
       int n,len,i;
       char c; 
       while (scanf("%s",s) && s[0]!='E')
       { 
               len=strlen(s),n=0;
               for (i=0;i<len;i++) 
               {
                        h[++n]=0;
                        while (s[i]>='0' && s[i]<='9') h[n]=h[n]*10+s[i]-'0',i++;
                        if (s[i]=='+') tp[n]=0;
                                  else tp[n]=1;
               }
               memset(dp,-1,sizeof(dp));
               dfs(1,n);
               printf("%lld %lld\n",dp[1][n][0],dp[1][n][1]);
       }
       return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题是关于MySQL服务器的错误信息。根据提供的引用内容,无法确定具体的原因。但是,根据常见的错误信息,这个错误可能是由于MySQL服务器无法更新PID文件导致的。PID文件是用来存储MySQL服务器进程ID的文件,如果服务器无法更新该文件,可能是由于权限问题或者其他系统配置问题引起的。为了解决这个问题,可以尝试以下几个步骤: 1. 检查MySQL服务器的日志文件,查看是否有其他错误或警告信息,以便更好地理解问题的根本原因。 2. 确保MySQL服务器的数据目录(/usr/local/mysql/data)具有正确的权限设置,MySQL服务器需要有足够的权限来读取和写入该目录。 3. 检查系统的磁盘空间,确保磁盘没有满,否则可能导致无法写入PID文件。 4. 如果问题仍然存在,可以尝试重新启动MySQL服务器,并监视日志文件以获取更多的错误信息。 请注意,这只是一些可能的解决方法,具体的解决方法可能因系统配置和环境而异。建议在解决问题之前备份重要的数据,并在进行任何更改之前仔细阅读相关文档或咨询专业人士。 #### 引用[.reference_title] - *1* *2* *3* [centos7安装大数据平台](https://blog.csdn.net/zhaoyaxiong_ctu/article/details/113151938)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值