ACM新手DAY 2 模拟和贪心

题解

A - Radio Station

题目:读入n和m。n是n个服务器的名称和ip地址,m是m个命令。找到每个命令对应的服务器的名称。

  • 模拟题
  • 注意点:头文件(cstring的话vj不给过。。。)
#include<iostream>
#include<string>
using namespace std;
  • 输入部分(服务器的名称和ip地址,命令的命令句和ip地址分别用两个二维数组储存)
    int n, m;
    cin >> n >> m;
    for(i=0; i<n; i++)
        for(j=0; j<2; j++)
        {cin >> s[i][j]; if(j==1) s[i][j] += ";";}//这里加了字符“;”,为了之后与命令的ip地址字符串好匹配

    for(i=0; i<m; i++)
        for(j=0; j<2; j++)
            cin >> ss[i][j];
  • 找匹配ip的函数
string bl(string s1[1005][2], string s2, int n)
{
    for(int ii=0; ii<n; ii++)
        if(s2 == s1[ii][1])
            return s1[ii][0];
}

B - Eleven

题目:起一个含有n个字符的名字,如果 i 是斐波纳契数列的成员,则第 i 个字符是‘O’, 如果不是,则第 i 个字符是‘o’

  • 模拟题
  • 逻辑部分
    int n;
    cin >> n;
    
    f[0] = 1; f[1] = 1;
    ch[0] = 'O'; ch[1] = 'O';
    
    for(int i=2; i<n;i++)
        ch[i] = 'o';
    for(int j=3; f[j-1]<n;j++)
    {
        f[j] = f[j-2] + f[j-1];//斐波那契数列
        ch[f[j]-1] = 'O';
    }
    for(int k=0; k<n; k++)
        cout << ch[k] ;

C - Duff in Love

题目:当且仅当没有正整数 a > 1 a>1 a>1使得 a ∗ a a*a aa x x x的除数时,正整数 x x x被称为可爱。读入数&n&,找出 n n n的正因数中最大的,可爱的。

  • 模拟题(这个比较难)
  • 逻辑部分(直接暴力找平方数判断也是一种方法,可惜会超时。。。所以要换简化算法)。补充:将n分解素因子得到 n = p 1 k 1 ∗ p 2 k 2 ∗ … p m k m n =p_1^{k1}*p_2^{k2}*…p_m^{k_m} n=p1k1p2k2pmkm例如: 12 = 2 2 ∗ 3 1 12=2^2*3^1 12=2231
    long long n;
    cin >> n;
    for(long long i=2;i<=pow(n, 0.5);i++)
    {
        while(n%(i*i)==0)//...含有i*i就直接除去一个i
              n=n/i;
    }
    cout << n ;

D - Checkpoints

题目:有 n 个检查点,参观至少 n-1 个。求路程最短。

  • 模拟题
  • 化繁为简,用四点构成的模型解决多点问题
  • 逻辑部分
    cin>>n>>x;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);//对坐标点排序

    //先分作n=1, n=2, n=3, n>=4分析,之后可以知道 n=3 是符合 n>=4的情况的,合并在 n>=4的情况里里面
    if(n==1) cout<<"0"<<endl;
    else if(n==2) cout<<min(abs(x-a[1]),abs(x-a[2]));
    else
    {
        //走好a[1],a[2],a[n-1],a[n]四个点,其他的点因为包括在里面也都经过了。其中包括不走最左的点和最右的点两种情况,每个又有两种路径。
        int x1 = abs(x-a[1]);
        int x2 = abs(a[1]-a[n-1]);
        int x3 = abs(x-a[n-1]);//舍弃n的时候的两种情况
        int s1 = min(x1+x2,x3+x2);

        int x4 = abs(x-a[2]);
        int x6 = abs(a[n]-a[2]);
        int x7 = abs(x-a[n]);//舍去1的时候的两种情况
        int s2 = min(x4+x6,x7+x6);

        cout << min(s1, s2);
    }

E - Animals

题目:做梦养动物,每天来一只,可以拒绝养这个动物,动物来的第一天吃多少,之后每天就吃多少,保证n天过后食物够吃,求最多可以养多少只。

  • 贪心
  • 注意点:1.输入的第二行是第 i 天来的动物吃的食物的量。
    2.审题很重要
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);//题目是有读入文件。。。
  • 逻辑部分
    int n, x, a[101], s(0);
    cin >> n >> x;
    for(int i=0; i<n; i++)
        cin >> a[i];

    int nn = n;
    for(int j=0;j<n;j++)
        a[j]=a[j]*(nn-j);//第j天来的动物吃的

    sort(a, a+n);//给不同动物最终食物量排排序

    if(a[0] > x) cout << 0 ;
    else
    {
        for(int k=0;k<n;k++)
            {
                if(a[k]<=x){s++; x-=a[k];} //s是可以养的动物的数目,当食物不够时就停止
                else break;
            }
        cout << s;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值