SDAU训练日志第十篇----------动态规划(6)(2018年2月7日)

今天突然想练练手水了西南民族大学的网络同步赛和哈理工训练赛的几个题,有两个题放上来:

佩奇打字

猪妈妈让佩奇练习打字她给了佩奇一篇只有小写字母的字符串S ( 1 <= |S| <= 105)。但是佩奇记不住键盘字母的位置只能看着键盘一个一个打淘气的乔治趁佩奇不注意偷偷的换了键盘按键的位置乔治是这样操作的乔治每次扣下来两个键帽并且将这两个键帽互换位置重新安回去乔治越玩越起劲一直重复了m(1 <= m <= 105)请输出佩奇打完字后屏幕上显示的实际字符串

输入描述:

第一行输入一个字符串S ( 1 <= |S| <= 105);
第二行输入一个数字m(1 <= m <= 105)表示佩奇要操作m
之后有m每行有两个字母 c1, c2表示佩奇要把这两个键帽互换位置

输出描述:

输出一行字符串 即佩奇用乔治玩坏的键盘输出的实际字符串


#include<iostream>
#include<string>
using namespace std;
string paper;
int main()
{
	int letter[128];
	for(int i=int('a');i<=int('z');i++)
		letter[i]=i;
	cin>>paper;
	int m=0;
	cin>>m;
	for(int i=0;i<m;i++)
	{
		char a,b;
		cin>>a>>b;
		swap(letter[a],letter[b]);
	}
	for(int i=0;i<paper.length();i++)
	cout<<char(letter[paper[i]]);
	cout<<endl;
	return 0;
}

1.刚开始想成了每次直接在输入的字符串中进行查找交换,结果交上直接TLE,后来想起来了交换字母表的方法,时间复杂度降下来了。构建新字母表这个思路比以前的好太多了。

2.char型实质是整型,整数能用的思路,字符型也行。


第二个题:

TRDD开了一家免费WiFi体验店所有人都可以免费连接WiFi,只有一个条件你要提前一天预约今天,TRDD收到了n(1 <= n <=1000)个人的预约每个人有一个时间段[L, R] (1 <= L <= R <= 5000)表示这个人预约连接WiFiL时刻到R时刻但是市面上只有一种路由器这种路由器单台最多能同时连接m(n <= 100)台设备, TRDD想要知道最少使用多少台路由器就能保证明天每个人都能连上WiFi。

输入描述:

第一行包含两个数n(1 <= n <=1000), m (1 <= m <= 100)表示今天有n个人预约以及路由单台最大连接个数m。
之后有ni行有两个数字 [L, R] (1 <= L <= R <= 5000)表示第i个人预约连接WiFi的时间是从LR。

输出描述:

输出一个数字表示TRDD最少需要开启的路由器的个数

#include<iostream>
#include<cmath>
int main()
{
    int a[5000+10]={0};
    int n,m,j,k,i,result,x,y;
   cin>>n>>m;
    while (n--)
    {
       cin>>x>>y;
        for (i=x;i<=y;i++)
        {
            a[i]++;
        }
    }
     
    int max=0;
    for (i=1;i<=5005;i++)
    {
        if (a[i]>max)
        max=a[i];
    }
    result=ceil(max*1.0/m);//向上取整
    cout<<result<<endl;
    return 0;
}
原来的思路是以安排时间类型为原型,按照结束时间升序,利用贪心做,后来想了想用时间点做时空复杂度更低,同一个时间点被占用次数的最大值/能够连接的最大数量,向上取整就是答案。

明天再搞线性DP吧,今天先写到这

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值