10.15解题报告

D:【基本算法—贪心算法】删数问题

描述

键盘输入一个高精度的正整数n(<=240位),去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。

这道题目我们可以用贪心法则来攻克

既然要每次删除一个数,那我们就需要让每一次都做出一个最好的选择,这样最后我们也就会得到最佳方案

如何每一次都作出最好的选择,也就是每一次都删除第一个比后面数字大得数,因为如果n比n-1大的话,后面再出现此类情况,我们可以保证n在最大的数位上,于是这个步骤我们可以用函数来完成。

void del(){
	len=st.size();
	while(m--){
	int p=0;
	while(p<len-1&&st[p]<=st[p+1]) p++;
	st.erase(p,1);
	len--;
	}
}

这里面我们使用了搜索,由于只要没有找到满足条件的p,p就会++,所以p最后会停在满足条件数的前一位但是如果找不到满足条件的数字,我们就应该删掉最高位的那一个数字下面我们应该做的事情就是删除前导零,我们依旧可以用搜索完成,p将会停留在第一个不为零的数字上
void pri(){
	int p=0;
	while(p<len-1&&st[p]==‘0‘){
	p++;
}
	for(int i=p;i<len;i++)
	cout<<st[i];
}


F:〖NOIP2008P〗排座椅

描述

上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来 之后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设 置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通 道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。

请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。

这道题也应该是一道贪心算法,因为我们要在有限的改变次数内做出最好的选择。

怎么样才能算是最好选择?

如果我们要在行之间隔出一条通道,那么我们就应该选择两行之间交头接耳人数最多的,在这里开一条通道

如果我们要在列之间隔出一条通道,那么我们就应该选择两列之间交头接耳人数最多的,在这里开一条通道

于是我们需要对每两行和每两列之间交头接耳的人做出排序,并且记录下他们的位置,然后进行选择

void readp(){
     cin>>n>>m>>nk>>mk>>d;
     for(int i=1;i<n;i++) h[i].id=i;
     for(int i=1;i<m;i++) l[i].id=i;
     int x1,y1,x2,y2;
     while(d--){
           cin>>x1>>y1>>x2>>y2;
           if(x1==x2) {
              if(y1<y2) l[y1].s++;
              else l[y2].s++;
              }
              else {
                   if(x1<x2) h[x1].s++;
                   else h[x2].s++;
                  }
           }
     }
    读入并且记录下每行每列交头接耳的人数,记录下行号和列号
void work(){
     sort(h+1,h+n,cmp);
     sort(l+1,l+m,cmp);
     sort(h+1,h+nk+1,cmp1);
     sort(l+1,l+mk+1,cmp1);
     for(int i=1;i<=nk;i++) cout<<h[i].id<<" ";
     cout<<endl;
     for(int i=1;i<=mk;i++) cout<<l[i].id<<" ";
     cout<<endl;
}把人数排序,并且由于输出也需要排序,所以我们还要使用函数对结构体进行排序
bool cmp(node p,node q){
     return p.s>q.s;
}

bool cmp1(node p,node q){
     return p.id<q.id;
}

B:〖NOIP2010P〗导弹拦截

描述

经过11 年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为0   时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径 的平方和。
某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。

只做出了40分的程序

这道题其实就是两个系统工作的最短半径,也就是必定会有导弹刚好落到这两个系统的边缘上,并且没有遗漏,否则这个半径一定可以继续缩短。

通过提示,我们知道可以利用半径的平方和比较大小

int dis(int x1,int y1,int x2,int y2){
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}

然后我们需要进行读入
void readp(){
     cin>>a>>b>>c>>d;
     cin>>n;
     for(int i=1;i<=n;i++)
     cin>>x[i]>>y[i];
}

接着就是要计算出每一次的平方和,然后比较大小,输出最小的那一个
void work(){
     int minv=10000000;
     for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++){
     int r1=dis(a,b,x[i],y[i]);
     int r2=0;
     for(int k=1;k<=n;k++)
     if(dis(a,b,x[k],y[k])>r1&&dis(c,d,x[k],y[k])>r2)
     r2=dis(c,d,x[k],y[k]);
     if(minv>r1+r2) minv=r1+r2;
     }
     cout<<minv;
}当然这个程序只能得到40分,因为它使用了三层循环
 
 
 
时间: 2025-01-21 21:24:13

10.15解题报告的相关文章

2019.10.03解题报告

总体来说能打的暴力都打了 期望\(100 + 40 + 30 = 170\) 实际\(100 + 40 + 10 = 180\) 数据良心(其实是数据太水惹) T1 第一眼觉得就是要找规律,然后直接找找不出来,所以用暴力搜一下 #include <queue> #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N = 2011; in

10.2解题报告

题目一:栈的优化 原代码:运用函数递归 由于我们知道火车出来的个数与火车总共的个数一定是一样的,所以可以用0 1来表示车辆的出入. 例如:101100 就表示进出进进出出,也就为132. 我们用ruv来表示进入的车子数,chuv表示出来的车子数,当chuv和ruv都等于撤资总数时,我们就找到了一种排列方法.当ruv小于n时,说明已经进去的车子数没到n节,还有空间继续进入车辆,我们可以写作 if(ruv<n) dfs(ruv+1,chuv);我们要保证出去的车子比进来的车子少,这样才可以符合实际的

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

解题报告 之 CodeForces 91B Queue

解题报告 之 CodeForces 91B Queue Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue.

Winter-2-STL-E Andy&#39;s First Dictionary 解题报告及测试数据

use stringstream Time Limit:3000MS     Memory Limit:0KB Description Andy, 8, has a dream - he wants to produce his very own dictionary. This is not an easy task for him, as the number of words that he knows is, well, not quite enough. Instead of thin

codeforces 505A. Mr. Kitayuta&#39;s Gift 解题报告

题目链接:http://codeforces.com/problemset/problem/505/A 题目意思:给出一个长度不大于10的小写英文字符串 s,问是否能通过在字符串的某个位置插入一个字母,使得新得到的字符串成为回文串. /**************************************(又到自我反省时刻) 做的时候,通过添加一个单位使得长度增加1,找出中点,检验前一半的位置,找出对称位置替换成对应的前一半位置的字符,然后原字符串剩下的部分追加到后面,再判断回文.但是由于

LeetCode: Pascal&#39;s Triangle 解题报告

Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] SOLUTION 1:很easy的题.注意记得把List加到ret中.比较简单,每一行的每一个元素有这个规律:1. 左右2边的是1.i, j 表示行,列坐标.2.

CH Round #56 - 国庆节欢乐赛解题报告

最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树,其中一些树上结有能够产生能量的魔力水果.已知每个水果的位置(Xi,Yi)以及它能提供的能量Ci.然而,魔幻森林在某些时候会发生变化:(1) 有两行树交换了位置.(2) 有两列树交换了位置.当然,树上结有的水果也跟随着树一起移动.不过,只有当两行(列)包含的魔力水果数都大于0,或者两行(列)都没有魔

uva 10881 Piotr&#39;s Ants 解题报告

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1822 题目意思:有一条 L 厘米长的杆,上面有 n 只蚂蚁,给出每只蚂蚁的朝向以及离杆上最左端的距离,问 T 秒之后每只蚂蚁到达的位置,如果 T 秒后某个位置有多只蚂蚁同时到达,那么这堆蚂蚁处于的位置 + Turning,如果超过这条杆的长度,输出F