第一题Range

关键:二分查找,查找不大于一个数的最大下标。

 #include <cstdlib>
#include <cstdio>
4 int compare (const void * a, const void * b){
return ( *(int*)a - *(int*)b );
}
int bisearch(int *array,int low, int high,int aim){
int mid;
while(low<=high){
mid = (low+high)>>;
if(aim<array[mid])
high=mid-;
else if(aim>array[mid])
low=mid+;
else
return mid;
}
// printf("%d\n",high);
return high;
}
int main(int argc, char* argv[]){
// freopen("in.txt", "r", stdin);
int pnum,qtime;
scanf("%d %d",&pnum,&qtime);
int *points = new int[pnum];
for(int i=; i<pnum; i++)
scanf("%d",&points[i]);
qsort(points,pnum,sizeof(int),compare);
int lower,higher;//range
int left,right;
for(int i=; i<qtime; i++){
scanf("%d %d",&lower,&higher);
left=bisearch(points,,pnum-,lower);
right=bisearch(points,,pnum-,higher);
if(right<){//notice
printf("0\n");
continue;
}
if(left<){//notice
printf("%d\n",right+);
continue;
}
if(points[left]==lower){
printf("%d\n",right-left+);
}else
printf("%d\n",right-left);
}
delete [] points;
return ;
}

  当使用cin/cout时候,Exceed Time Limit;此外,我还比较了使用静态分配数组和动态堆分配数组的运行时间差异,发现几乎相同。

第二题祖玛,自己尝试写了一个简单的双向链表,能进行插入和删除。20个案例,最后一个超时。此外,这个题也是C/C++混杂起来使用,好尴尬。

 #include <cstdio>
#include <string>
#include <iostream>
using namespace std;
class Node{
public:
Node* prev;
Node* next;
char content;
Node():prev(NULL),next(NULL),content(){}
Node(char c):prev(NULL),next(NULL),content(c){}
};
class Dolist{
public:
Node head;
int len;
Dolist(string in);
~Dolist();
Node* insert(int pos, char ch);
void del(Node *inpos);
void print();
};
Dolist::~Dolist(){
Node *fir=head.next;
while(fir){
Node *next=fir->next;
delete fir;
fir=next;
}
}
Node* Dolist::insert(int pos, char ch){
Node *tmp = new Node(ch);
Node* cur=&head;
//pos<=len
if(pos==len){//insert in the end
while(cur->next){
cur=cur->next;
}
cur->next=tmp;
tmp->prev=cur;
}else{
for(int i=;i<pos;i++){
cur=cur->next;
}
Node* nex=cur->next;
cur->next=tmp;
tmp->prev=cur;
tmp->next=nex;
nex->prev=tmp;
}
len++;
return tmp;
}
void Dolist::del(Node *inpos){
if(inpos==&head)
return;
int dellen=;//num of same nodes
Node *fir=inpos,*las=inpos;//pointers between same nodes,from beginning to end
while(fir->content==fir->prev->content){//search left
dellen++;
fir=fir->prev;
}
while(las->next){//search right
if(las->content==las->next->content){
dellen++;
las=las->next;
}else
break;
}
if(dellen>=){//if num is above to 3,delete
Node *tmp=fir->prev;
fir->prev->next=las->next;
if(las->next)
las->next->prev=fir->prev;
Node *tmp1=fir->next;
while(tmp1!=las){
delete fir;
fir=tmp1;
tmp1=fir->next;
}
delete fir;
delete las;
len -= dellen;
del(tmp);//iteration }
}
void Dolist::print(){
if(head.next==NULL)
printf("-\n");
else{
Node *tmp=head.next;
while(tmp){
putchar(tmp->content);
tmp=tmp->next;
}
printf("\n");
}
}
Dolist::Dolist(string in){
len=;
int siz=in.size();
for(int i=; i<siz; i++){
insert(i,in[i]);
}
}
int main(int argc, char* argv[]){
//freopen("in.txt","r",stdin);
string init;
getline(cin,init);
Dolist zuma(init);//initial
int time;
scanf("%d",&time);
int pos;
char ch;
while(time--){
scanf("%d %c",&pos,&ch);
Node *inpos = zuma.insert(pos,ch);
zuma.del(inpos);
zuma.print();
}
return ;
}

第三题灯塔,先对x坐标使用快速排序,排序后对y坐标进行归并排序,在归并排序的同时求出顺序对的数目。20个案例通过19个,最后一个超时。

 #include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef struct tower{
int x;
int y;
}Tower;
int compare(const void *a,const void *b){
return ((*(Tower*)a).x - (*(Tower*)b).x);
}
long long Merge(int *array, int m, int mid, int n){
long long tmp=;
int *copy=new int[n-m+];
int i,j,k=;
for(i=m,j=mid+;i<=mid&&j<=n;){
if(array[i]<array[j]){
copy[k]=array[i];
tmp += (n-j+);//这是最关键的,在进行merge时,如果array[i]<array[j],那么从j到n的数都大于array[i]
i++;
}else{
copy[k]=array[j];
j++;
}
k++;
}
if(i<=mid){
for(int ii=i; ii<=mid; ii++){
copy[k]=array[ii];
k++;
}
}else if(j<=n){
for(int ii=j; ii<=n; ii++){
copy[k]=array[ii];
k++;
}
}
memcpy(array+m,copy,(n-m+)*sizeof(int));
delete [] copy;
return tmp;
}
long long MergeSort(int *array, int m, int n){
if(m==n) return ;
int mid = m+((n-m)>>);
long long num1 = MergeSort(array,m,mid);
long long num2 = MergeSort(array,mid+,n);
long long num3 = Merge(array,m,mid,n);
return num1+num2+num3;
} int main(int argc,char *argv[]){
//freopen("in.txt","r",stdin);
int num;
scanf("%d",&num);
Tower *all = new Tower[num];
for(int i=; i<num; i++){
scanf("%d %d",&(all[i].x),&(all[i].y));
}
qsort(all,num,sizeof(Tower),compare);
int *ally = new int[num];//取出所有的y,通过归并排序求出顺序对
for(int i=; i<num; i++)
ally[i]=all[i].y;
long long out = MergeSort(ally,,num-);
printf("%lld\n",out);
delete [] all;
delete [] ally;
return ;
}

Tsinghua dsa mooc pa1的更多相关文章

  1. 《Tsinghua oc mooc》第8~10讲 虚拟内存管理

    资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 第八讲 虚拟内存概念 为什 ...

  2. 《Tsinghua oc mooc》第5~7讲 物理内存管理

    资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 段式内存管理中,逻辑 ...

  3. 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用

    资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...

  4. 【DSA MOOC】有序向量二分查找的三个 版本

    内容来自 TsinghuaX: 30240184X 数据结构(2015秋) 课程的Vector一章,对有序向量的二分查找有三个版本 三个版本的函数原型是一致的,都是 Rank search(T con ...

  5. 【DSA MOOC】起泡排序的原理及常数优化

    根据学堂在线TsinghuaX: 30240184X 数据结构(2015秋)这门课的内容,对bubblesort做了一些总结. 1. bubblesort(起泡排序),原理来自这样一个观察规律:若序列 ...

  6. Tsinghua dsa pa2

    第一题,列车调度(train) 在这个题目中,模拟压栈出栈,同时判断调度方案是否可行. #include <cstdio> #include <cstring> #define ...

  7. 《Tsinghua os mooc》第21~22讲 文件系统

    第二十一讲 文件系统 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能. 组织.检索.读写访问数据 大多数计算机系统都有文件系统 Google 也是一个文件系统 文件是具有符号名,由 ...

  8. 《Tsinghua os mooc》第17~20讲 同步互斥、信号量、管程、死锁

    第十七讲 同步互斥 进程并发执行 好处1:共享资源.比如:多个用户使用同一台计算机. 好处2:加速.I/O操作和CPU计算可以重叠(并行). 好处3:模块化. 将大程序分解成小程序.以编译为例,gcc ...

  9. 《Tsinghua os mooc》第15~16讲 处理机调度

    第十五讲 处理机调度 进程调度时机 非抢占系统中,当前进程主动放弃CPU时发生调度,分为两种情况: 进程从运行状态切换到等待状态 进程被终结了 可抢占系统中,中断请求被服务例程响应完成时发生调度,也分 ...

随机推荐

  1. MTK 2G芯片使用联通卡在深圳无法拨打112原因

    2.75G GSM模块在深圳客户这边联调到最后,客户这边遇到各种概率性问题,基本都是对方使用的配件不够好造成的,如天线.SIM卡座等配件. 一旦这些配件不好,就会出现概率性的错误,非常难以复现,所以在 ...

  2. C/C++ 笔试、面试题目大汇总 转

    C/C++ 笔试.面试题目大汇总 这些东西有点烦,有点无聊.如果要去C++面试就看看吧.几年前网上搜索的.刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善. 1.求下面函数的返回值( ...

  3. html标签之meta标签

    1  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   ...

  4. Linux下安装oracle11g

    1.安装环境: Linux:Redhat Enterprise Linux 6.3 64位 Oracle:Oracle Database 11g for Linux x86-64 64位 2.修改操作 ...

  5. Foundation--NSString+NSMutableString

    NSString 字符串创建: 1.NSString *strr = @"0123456789"; 2.NSString *str = [NSString stringWithSt ...

  6. IOS总结 静变量static、全局变量extern、局部变量、实例变量

    1.静态变量 static 什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用s ...

  7. Gengxin讲STL系列——String

    衔接上一篇引导. 作为第一篇博客,就要大气一点. 可我好像并不知道怎么才能让自己的博客大气一点= =: 明天是我生日,自己先买个中文域名庆祝了一下…… 好了,废话说完了,结果博客也没大气到哪去……,正 ...

  8. linux学习笔记之线程

    线程同步机制:http://www.cnblogs.com/zheng39562/p/4270019.html 一.基础知识 1:基础知识. 1,线程需要的信息有:线程ID,寄存器,栈,调度优先级和策 ...

  9. 【转】【可用】Android 登录判断器,登录成功后帮你准确跳转到目标activity

    我们在使用应用时肯定遇到过这样的情景,打开应用,并不是需要我们登录,你可以浏览应用中的大部分页面,但是当你想看某个详情页的时候,点击后突然跳转到了登录页面,好,我们输入账号密码,点击登录,登录成功,跳 ...

  10. jQuery的事件和动画

    1.animate的应用 animate(params,[duration],[easing],[callback]) 参数实例: params:     {width:"20%" ...