11.10 考试整理

总结 :再次爆零╮(╯▽╰)╭,就当noip Rp++O(∩_∩)O~~

 正常开始读题,T1这不是模拟吗,又看了看样例,感觉还行,T2 woc昨晚上刚学了exgcd,这张的好像exgcd啊,觉得可以搞。T3 smg 样例都看不懂哎,最后骗骗分放弃了。第二次回头去看T1,再读一遍还是暴力模拟,嗯,我想的能做O(n*m),看了看数据范围woc10^18 smg 这O(n) 也过不了啊 得O(1)啊 ,我哪会什么算法是O(1)啊,看60分数据3000,n^2的数据范围貌似可以的,我想的算法是O(n*m),(并没有意识到到错误其实到这我的想法就出现了一种常见的错误“想当然 。。。”) 我想的就是直接折叠后覆盖掉原来的序号,以后再折叠肯定没有被覆盖掉的了。事实上是我想错了,也可以再折叠覆盖掉的序号,因为这样的效果与在折叠覆盖掉的效果一样。可是我已经全修改了,全wa了。T2搞搞搞自己!!!感觉很正确其实不如30分的枚举╮(╯▽╰)╭。T3还是一脸懵逼让了多组数据也不好偏分就把样例丢上去了。

经验:

1 .  一切一题目描述为主,不要“想当然”。切记,切记,切记。

2 . 如果你的想法的时间复杂度 跟 数据范围差别大不在一档上 ,这个时候应该警觉想法是不是哪里出了问题。

3 . 注意数据范围如果n太大不能接受,考虑考虑m。

4 . 当你打一个你无法证明正确性,一定要先打暴力,因为在考场上打的算法正确性很低。最后很可能还不如暴力。

5 . 如果有一个题10分钟样例看不懂or没点思路。考虑选择性的放弃。

T1 

【问题描述】
一张长度为?的纸带,我们可以从左至右编号为0 − ?(纸带最左端 标号为
0) 。 现在有?次操作, 每次将纸带沿着某个位置进行折叠, 问所有操作之后纸带
的长度是多少。
【输入格式】
第一行两个数字?, ?如题意所述。
接下来一行?个整数代表每次折叠的位置。
【输出格式】
一行一个整数代表答案。
【样例输入】
5 2
3 5
【样例输出】
2
【样例解释】
树上有只鸟。
【数据规模与约定】
对于60%的数据,?, ? ≤ 3000。 
对于100%的数据,? ≤ 10^18, ? ≤ 3000。 

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
LL n,m;
LL xh[5000];
int main()
{
	freopen("he.in","r",stdin);
	freopen("he.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++)
	scanf("%lld",&xh[i]);
	LL l=0,r=n;
	for(int i=1;i<=m;i++)
	{
		LL mid=(l+r)/2;
		if(xh[i]<=mid)
		{
			for(int j=i+1;j<=m;j++)
			{
				if(xh[j]<xh[i])
				xh[j]=xh[i]+(xh[i]-xh[j]);	
			}
			l=xh[i];
		}
		else 
		{
			for(int j=i+1;j<=m;j++)
			{
				if(xh[j]>xh[i])
				xh[j]=xh[i]-(xh[j]-xh[i]);	
			}
			r=xh[i];
		}
	}
	printf("%lld",r-l);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T2

【问题描述】
给你?, ?, ?, ?,求满足? ≤ (? × ?)  ???  ? ≤ ?最小的正整数?。
【输入格式】
第一行一个数?代表数据组数。
接下来?行每行四个数代表该组数据的?, ?, ?, ?。
【输出格式】
对于每组数据,输出一行代表答案。如果不存在解,输出“−1” 。
【样例输入】
1
5 4 2 3
【样例输出】
2
【样例解释】
叫南小鸟。
【数据规模与约定】
对于30%的数据,保证有解且答案不超过10^6。
对于另外20%的数据,? = ?。
对于100%的数据,1 ≤ ? ≤ 100,0 ≤ ?, ?, ?, ? ≤ 10^9。

题解 :前百分之30枚举即可,之后L==R的用exgcd就行。剩下的不会了 QAQ。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
LL m,s,l,r,t;
LL x,y;
LL T;
void exgcd(LL a,LL b)
{
	if(b==0)
	{
		x=1,y=0;
		return ;
	}
	exgcd(b,a%b);
	LL x2=x,y2=y;
	x=y2;
	y=x2-a/b*y2; 
}
int main()
{
	freopen("she.in","r",stdin);
	freopen("she.out","w",stdout);
	scanf("%lld",&T);
	int aaa;
	while (T!=0)
	{
		T--;
		x=0,y=0;
		scanf("%lld%lld%lld%lld",&m,&s,&l,&r);
		if(l==r)
		{
			t=l;
			if(t%__gcd(m,s)!=0|| m<=l)
				printf("-1\n");
			else 
			{
				LL haha=t/__gcd(m,s);
				exgcd(s,m);
				x*=haha;
				haha=m/__gcd(m,s);
				while(x<0) x+=haha;
				x%=haha;
				printf("%lld\n",x);
			}
		}
		else 
		{
			for(LL i=1;i<=1000000;i++)
			{
				if(l<=s*i%m&&s*i%m<=r)
				{
					printf("%lld\n",i);
					break;
				}
			}
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

 

转载于:https://my.oschina.net/u/3009052/blog/785843

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值