NJUOJ 上机13 感想

题目一

  输入一个整数加法算式,然后非降序输出。

    string mystr;
    vector<int> vec;
    while(getline(cin, mystr,'+')) //getline()根据+号作为分隔符读取输入,储存到mystr
        vec.push_back(stoi(mystr)); //stoi()将mystr储存为带符号整数
    
    sort(sum.begin(),sum.end()); //.end()返回末尾元素的下一位置的迭代器

    for(size_t i = 0; i < vec.size()-1; i++) //不给最后一个元素输出,放到for结束后输出。vector需要用size_t类型的下标
        cout << vec[i] << '+';
    cout << vec.back();//.back()才是返回最后一个元素的引用

  又学到了新的输入方法。vector好用,不过还需要多学一点再用……

 

题目四

  对于一个字符串S,判断它是否能通过重复某一子串至少1次构成。例如“abab“可以由”ab“重复1次构成,而”aba“则不可能通过重复子串构成。

int n = s.size();
//...
// 获取到了一个合法的字串长度,记为c = n / i;
string t = "";
for(int j = 0; j < c; j++)
{
    t+=s.substr(0,i);
}
if(t == s)
    return true;
//...

  通过将指定字串通过复制与原串比较,字串就是s.substr(0,i)

 

题目五

  现有一根长度为N的绳子,按照如下两个规则分成K段:
    1) 分割后每段的长度只能为A、B或者C;
    2) 分割后的总段数最大。
  比如绳子长度为5,A、B、C分别为5、3、2,则分成3和2能得到最大段数。

  就是一个买鸡的问题……参考代码是完全搜索,但是理论上可以通过排序ABC来达到一些优化的效果。未经尝试,如果错误请指正。

  

//a > b > c
remain = n - a*x - b*y;
if(remain>=0 && remain%c==0)
    cout << x + y + remain / c; 
//break, ...

 

题目七

  程序设计竞赛中,OJ系统的排名一般遵循以下规则:
  每个参赛者(队伍)都有一个唯一的编号,当比赛结束时,
    1) 通过题数较多的排名高;
    2) 如果通过题数相同,则总花费时间较少的排名高;
    3) 如果经过上面两条后排名仍相同,则按照编号递增排序。
  某道题的花费时间为第一次正确提交的时间加上罚时——之前每次错误提交都会增加20分钟的罚时,队伍的总花费时间为所有通过的题目的花费时间之和。
  现有一张比赛结束时的提交记录表,依据上述规则给出队伍的排名。提交记录表的格式如下:

    队伍编号    问题编号    提交时间(秒)    是否通过
        1                2            3000                      0
        1                2            3100                      1
        2                1            4200                      1


  “是否通过“一列中,1表示正确通过,否则为0。假设一共有3只队伍,那么根据上表,队伍1和队伍2各通过1题,队伍3一道题都没能通过。队伍1总花费时间为3100+1200=4300,队伍2总花费时间为4200。因此最终排名为:2,1,3。

 

  memset()用来初始化结构体,真是没想到……以前都是拿来初始化动态数组的。

  还有就是排序算法。按理说这个题目是很简单的(在语文能力良好的情况下),记录每一条数据,ac则加罚时,否则wa多少次都不罚时。越到后期每题的耗时就会越高,因为计入总时长的并不是上一题ac的时间到本题ac的时间。

  贴一下排序算法。之前也有这样的思路,但是不知道为什么没有效果……

struct info {
    int no; //team number
    int ac;  
    int tt; //total time
};
bool zhcmp(const info&a, const info &b)
{
    if (a.ac != b.ac)
    {
        return a.ac > b.ac;
    }
    if (a.tt != b.tt)
    {
        return a.tt < b.tt;
    }
    return a.no < b.no;
}

 

转载于:https://www.cnblogs.com/KakagouLT/p/8125185.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值