Tsinghua dsa mooc pa1
第一题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的更多相关文章
- 《Tsinghua oc mooc》第8~10讲 虚拟内存管理
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 第八讲 虚拟内存概念 为什 ...
- 《Tsinghua oc mooc》第5~7讲 物理内存管理
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 段式内存管理中,逻辑 ...
- 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...
- 【DSA MOOC】有序向量二分查找的三个 版本
内容来自 TsinghuaX: 30240184X 数据结构(2015秋) 课程的Vector一章,对有序向量的二分查找有三个版本 三个版本的函数原型是一致的,都是 Rank search(T con ...
- 【DSA MOOC】起泡排序的原理及常数优化
根据学堂在线TsinghuaX: 30240184X 数据结构(2015秋)这门课的内容,对bubblesort做了一些总结. 1. bubblesort(起泡排序),原理来自这样一个观察规律:若序列 ...
- Tsinghua dsa pa2
第一题,列车调度(train) 在这个题目中,模拟压栈出栈,同时判断调度方案是否可行. #include <cstdio> #include <cstring> #define ...
- 《Tsinghua os mooc》第21~22讲 文件系统
第二十一讲 文件系统 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能. 组织.检索.读写访问数据 大多数计算机系统都有文件系统 Google 也是一个文件系统 文件是具有符号名,由 ...
- 《Tsinghua os mooc》第17~20讲 同步互斥、信号量、管程、死锁
第十七讲 同步互斥 进程并发执行 好处1:共享资源.比如:多个用户使用同一台计算机. 好处2:加速.I/O操作和CPU计算可以重叠(并行). 好处3:模块化. 将大程序分解成小程序.以编译为例,gcc ...
- 《Tsinghua os mooc》第15~16讲 处理机调度
第十五讲 处理机调度 进程调度时机 非抢占系统中,当前进程主动放弃CPU时发生调度,分为两种情况: 进程从运行状态切换到等待状态 进程被终结了 可抢占系统中,中断请求被服务例程响应完成时发生调度,也分 ...
随机推荐
- JQuery中阻止事件冒泡方式及其区别
JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function( ...
- Cocos2d-x3.1UserDefaule类具体解释
在Cocos2d-x存储数据使用的类是UserDefault类,以下分析下该类的使用 //.h #include "base/CCPlatformMacros.h" #includ ...
- uva 10911 - Forming Quiz Teams(记忆化搜索)
题目链接:10911 - Forming Quiz Teams 题目大意:给出2 * n个选手的坐标, 要求将所有的选手分成n组, 每组两个人, 所有组的两个人之间的距离之和要最小, 输出最小值. 解 ...
- Swift的基础,操作符,字符串和集合类型
这篇文章主要讲解苹果Swift官方指南的第二章前四节的要点内容,如果想看完整的英文文档可以去苹果开发者页面下载. Basic 声明常量let 声明变量var 注释依旧使用"//" ...
- 用JSmooth制作java jar文件的可运行exe文件教程【图文】
这是我之前在个人博客3yj上面写的一篇文章,如今转载过来,原文地址 (这不是广告哦) 几年前,刚接触java的是,就想用一些方法把自己的劳动果实保护起来,曾经也用过非常多这种工具,有一个特别好用,今天 ...
- LR性能测试应用
上半个月,由于工作和上课两边跑,几乎没有属于自己的时间去做自己想做的事,在没有加班的一天晚上,我突然冲动地跑到图书馆借了一本书<LR性能测试应用>——姜艳. 我总喜欢看那些陈旧的书,因为在 ...
- idea maven 无法加载已经安装的模块
新建了一下maven项目,下面新建了一个模块,某一个模块clean install之后,别的模块虽然使用dependency标签引入了,但是仍然无法使用, 这个时候,应该重新建立一个项目,将原有项目的 ...
- 自动匹配HTTP请求中对应实体参数名的数据(性能不是最优)
/// <summary> /// 获取请求参数字段 /// </summary> /// <typeparam name="T"></t ...
- 【转】Java与C#语言级比较
原文链接:http://www.harding.edu/fmccown/java_csharp_comparison.html Java 程序结构 C# package hello;public cl ...
- HDU 5792 World is Exploding
题意: 给出n代表序列的长度,接下来给出序列A.找出abcd满足abcd互不相等1<=a<b<c<d<=n的同时A[a]<A[b],A[c]>A[d],问这样 ...