Codeforces Round #525 (Div. 2)

Codeforces Round #525 (Div. 2)

glhf

T1:

题意:求两个数\(a,b\)使\(1<=a,b<=n\)\(a\%b==0\),\(a/b<n\)\(a*b>n\)

\(n<=100\)

当时直接打了暴力

#include<map>
#include<queue>
#include<cmath>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++){
			if(i%j==0&&i*j>n&&i/j<n){
				printf("%d %d\n",i,j);
				return 0;
			}
		}
	printf("-1\n");
	return 0;
}





后来hack人的时候发现还可以这么写(我是sb

#include<map>
#include<queue>
#include<cmath>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
int main(){
	scanf("%d",&n);
	if(n>1) printf("%d %d\n",n,n);
	else printf("-1\n");
	return 0;
}

T2:

直接sort去重,从小到大减,记着减了多少

#include<map>
#include<queue>
#include<cmath>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
int n,k,a[maxn],b[maxn],num,cnt;
int main(){
	//freopen(".out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	a[0]=-1;
	for(int i=1;i<=n;i++)
		if(a[i]!=a[i-1])
			b[++num]=a[i];
	for(int i=1;i<=num;i++){
		int x=b[i]-cnt;
		if(x>0){
			printf("%d\n",x);
			cnt+=x;
			k--;
			if(k==0) return 0;
		}
	}
	for(int i=1;i<=k;i++) printf("0\n");
	return 0;
}

T3:

模拟...?!

题目给了\(n+1\)次机会,我们先用前\(n\)次机会做加法,把\(a\)数组的值变为膜n意义下为\(0,1,2,3...n-1\)(因为是膜意义下,你从后往前考虑每个元素,一直加就是了)

最后所有元素对\(n\)取膜,\(a\)数组就真的变成了\(0,1,2,3...n-1\)

#include<map>
#include<queue>
#include<cmath>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e4+100;
int n,a[maxn],y;
int main(){
	freopen("1.in","r",stdin);
	//freopen(".out","w",stdout);
	scanf("%d",&n);
	printf("%d\n",n+1);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=n;i>=1;i--){
		int x=0;
		y%=n;
		while(1){
			if((y+a[i])%n==n-(n-i+1)) break;
			x++;
			y++;
		}
		printf("1 %d %d\n",i,x);
	}
	printf("2 %d %d",n,n);
	return 0;
}

T4:

交互题啊。。。mmp

根本不知道怎么测试对错,硬着头皮提交,竟然1A??!

思路是从高位向低位去试探,一开始先问\(0,0\),得到大小关系

第一次用二进制的100000 (29个0)去亦或两个数,读取结果

如果两个数大小关系变了,说明两个数的这一位不一样,讨论一下,得到哪个是1哪个是0,同时记\(ny,my\)加上1或0,这个\(ny,my\)就是前面位已经确定的

如果大小关系没变,用100000(29个0)去亦或第一个数,0去亦或第二个数,如果第一个数小,说明两个数的这一位都是1,要不就都是0。

第二次用二进制的100000(28个0)+ny,100000(28个0)+my,去亦或两个数...和上面一样...

最后得到了结果...其实就是\(ny,my\),请无视\(n,m\)

#include<map>
#include<queue>
#include<cmath>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m,an,ny,my,bn;
int main(){
	freopen("1.in","r",stdin);
	//freopen(".out","w",stdout);
	printf("? 0 0\n");
	fflush(stdout);
	scanf("%d",&an);
	for(int i=29;i>=0;i--){
		int x=1<<i;
		ny+=x,my+=x;
		printf("? %d %d\n",ny,my);
		fflush(stdout);
		ny-=x,my-=x;
		scanf("%d",&bn);
		if(an*bn<0){
			if(an==1) n+=x,ny+=x;
			else m+=x,my+=x;
			printf("? %d %d\n",ny,my);
			fflush(stdout);	
			scanf("%d",&an);
		}
		else{
			ny+=x;
			printf("? %d %d\n",ny,my);
			fflush(stdout);
			ny-=x;
			scanf("%d",&bn);
			if(bn==-1){
				ny+=x,my+=x;
				n+=x,m+=x;
			}
		}
	} 
	printf("! %d %d\n",n,m);
	fflush(stdout);
	return 0;
}

T5:

应该是一道01分数规划题,感觉像是最大密度子图??

然而我并不会打

GG

posted @ 2018-12-05 00:50  nianheng  阅读(243)  评论(3编辑  收藏  举报