Codeforces Round #525 (Div. 2)
阿新 • • 發佈:2018-12-05
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