今天突然想练练手水了西南民族大学的网络同步赛和哈理工训练赛的几个题,有两个题放上来:
佩奇打字
猪妈妈让佩奇练习打字,她给了佩奇一篇只有小写字母的字符串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)表示这个人预约连接WiFi从L时刻到R时刻。但是市面上只有一种路由器,这种路由器单台最多能同时连接m(n <= 100)台设备, TRDD想要知道最少使用多少台路由器就能保证明天每个人都能连上WiFi。
输入描述:
第一行包含两个数n(1 <= n <=1000), m (1 <= m <= 100)表示今天有n个人预约,以及路由单台最大连接个数m。
之后有n行,第i行有两个数字 [L, R] (1 <= L <= R <= 5000)表示第i个人预约连接WiFi的时间是从L到R。
输出描述:
输出一个数字表示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吧,今天先写到这