代码思路详解——初识C++(勿喷)

都是之前的博客了,发现草稿箱里面还有很多……

容器的使用

  • 栈:①考虑栈为空     ②考虑出栈的个数

有关lower_bound函数的使用

lower_bound

结构体

写一个代码思路很重要,就拿这个例题来说,首先,我们可以将起始点加入我们的队列中,距离和供油量为0.需要得到多组数据并为其赋值还要不互相影响,要使用什么知识来解决这个问题呢?我们最先可能会想到数组,但数组是有局限性的,无法将汽油以及和站点很好的联系起来,这个时候,我们可以用结构体数组来存储数据;

这个例题是单个输出单词,并不计入空格,使输入与输出数据互不影响

结构体存位置:

 

1

Step(int xx, int s):x(xx), steps(s){ }


是这个Step结构体的构造函数,C++中的结构体和C中不太一样,已经可以像和C++中的类一样写入函数了,
函数括号后面的是初始化列表,上面的写法等价于:

1

2

3

4

Step(int xx, int s){

    x = xx;

    steps = s;

}

数组

其次,这点很重要,用数组下标解决问题使问题简单了很多,我们可以用数组下标解决很多问题:

例一可以将数组下标作为加油站的站点

②可以用数组下标来计算每个数字出现的次数

 

单目运算符

目前就是这个题运用单目运算符,灵活用到了&与^符号的应用,&相同则为0,否则为1,而^运算,有0则为0;

a -= (a & 1) ^ 1;      

1&1=0         3&1=2     2&1=3      即偶数加一,奇数减一

1^1=1          3^1=3      2^1=0       即偶数均为0,奇数不变

数据的不重复输出

将数字不重复输出

 for(i=1;i<m;i++){ 
        for(j=0;j<i;j++){
            if(a[i]==a[j]){
                break;
            }
        }

②set使用练习:输出字符中不重复的字符

#include<set>
int main()
{
char c;
set<char> set_c;//创建set
while(cin.get(c))
set_c.insert(c);//插入,set不支持下标,insert返回pair,first指向元素,second是一个boll值,true表示插入成功,false表示已有元素
set<char>::iterator iterator=set_c.begin();//创建迭代器指向首
while(iterator!=set_c.end())
{
cout<<* iterator;//输出迭代器指向,只读,不可修改值
iterator++;
}
}

char型与int型的转换:

把一个数字字符ch,转为一个整数,就是ch-'0'当然ch-48也行

边计算边取余: 运算速度更快

题目:CodeForces - 869B

#include<cstdio>
using namespace std;
int main() {
	long long a,b,ans;
	while(~scanf("%lld%lld",&a,&b)) {
	    ans=1;
		for(long long i=a+1; i<=b; i++) {
			if(i%10==0) {
				ans=0;
				break;
			}
			else ans*=i%10;
	    }
		printf("%lld\n",ans%10);
	}

	return 0;
}

大数据不要用cin and cout,两杯速度的 差距

逆向思维:看了题解还不太明白的一道题

题目:CodeForces - 938D Buy a Ticket

#include<cstdio>
#include<cstring>
#define lson l,mid,rt<<1
#define rson mid,r,rt<<1|1 //建树****** 
#define maxn 200005
using namespace std;

//将原数据建树,单点修改,相同位置++,想了半天,好像是错的
//看了别人的思路,咋也想不到用线段树怎么去解决这个问题 
//倒叙插入,最后一个插入的数是不会改变的,用节点保存空位数 
//2 69  __  __  69  __ (需要前面有3个空位才能插入)
//1 33  __  33  69  __ (需要前面有2个空位才能插入)
//1 51  __  33  69  51 (需要前面有2个空位才能插入)  前面只有1个空位  故插入后面空格
//0 77  77  33  69  51 (需要前面有1个空位才能插入)
int n,p[maxn],v[maxn];

int tree[maxn<<2],ans[maxn];
void build(int l,int r,int rt) {
	tree[rt]=r-l;
	if(tree[rt]==1) {
		//res[rt]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(lson);
	build(rson);
} 
void update(int pos,int val,int l,int r,int rt) {
	--tree[rt];
	if(r-l==1) {
		ans[l]=val;
		return ;
	}
	int mid=(l+r)>>1;
	if(pos<tree[rt<<1]) update(pos,val,lson);//****** 
	else update(pos-tree[rt<<1],val,rson);
	
}
int main() {
	int n,i;
	while(~scanf("%d",&n)) {
	
		for(i=0;i<n;i++) {
			scanf("%d%d",&p[i],&v[i]);
		}
		build(0,n,1);
		for(i=n-1;i>=0;i--) {
			update(p[i],v[i],0,n,1);
		}
		for(i=0;i<n;i++)
		printf("%d%c",ans[i],i!=(n-1)?' ':'\n');
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值