Codeforces Round #525 (Div. 2)
Posted nianheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",i,j);
return 0;
}
}
printf("-1
");
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);
else printf("-1
");
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
",x);
cnt+=x;
k--;
if(k==0) return 0;
}
}
for(int i=1;i<=k;i++) printf("0
");
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+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
",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
");
fflush(stdout);
scanf("%d",&an);
for(int i=29;i>=0;i--){
int x=1<<i;
ny+=x,my+=x;
printf("? %d %d
",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
",ny,my);
fflush(stdout);
scanf("%d",&an);
}
else{
ny+=x;
printf("? %d %d
",ny,my);
fflush(stdout);
ny-=x;
scanf("%d",&bn);
if(bn==-1){
ny+=x,my+=x;
n+=x,m+=x;
}
}
}
printf("! %d %d
",n,m);
fflush(stdout);
return 0;
}
T5:
应该是一道01分数规划题,感觉像是最大密度子图??
然而我并不会打
GG
以上是关于Codeforces Round #525 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #525 (Div. 2)
Codeforces Round #525 (Div. 2)A. Ehab and another construction problem
Codeforces Round #525 E - Ehab and a component choosing problem
Codeforces Round #436 E. Fire(背包dp+输出路径)