AtCoder Beginner Contest 319
\(A - Legendary Players\)
map<char ,int >mp;
void solve(){
string s;
cin>>s;
cout<<mp[s[0]]<<'\n';
//puts(ans>0?"YES":"NO");
//puts(ans>0?"Yes":"No");
}
signed main(){
mp['t']=3858;
//ksun48
mp['k']=3679;
// Benq
mp['B']=3658;
// Um_nik
mp['U']=3648;
// apiad
mp['a']=3638;
// Stonefeang
mp['S']=3630;
// ecnerwala
mp['e']=3613;
// mnbvmar
mp['m']=3555;
// newbiedmy
mp['n']=3516;
// semiexp
mp['s']=3481;
int t=1;
while(t--){
solve();
}
}
\(B - Measure\)
理解了半天题意,然后就按照题目的意思暴力模拟,我现在也没懂他在干什么。
void solve(){
int n=read();
for(int i=0;i<=n;i++){
if(i==0){
cout<<1;
continue;
}
int ans=10;
for(int j=1;j<=9;j++){
if(n%j==0&&i%(n/j)==0){
ans=min(ans,j);
}
}
if(ans==10)cout<<'-';
else cout<<ans;
}
//puts(ans>0?"YES":"NO");
//puts(ans>0?"Yes":"No");
}
\(C - False Hope\)
这题纯差评,一开始感觉题意就没说清楚。
最后写完 \(DE\) 回来看这题,猜了个解法,然后 \(next_permutation\) 的 \(+10\) 写成了 \(+9\) 到最后也没能看到。
这题就是穷举,因为单纯 \(9!*3\) 是可以通过的。
void solve(){
int a[4][4],b[4][4];
int p[10];
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
a[i][j]=read();
}
}
for(int i=1;i<=9;i++){
p[i]=i;
}
int fenzi=0,fenmu=0;
do{
int cnt=1,ok=1;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
b[(p[cnt]-1)/3+1][(p[cnt]-1)%3+1]=cnt;
cnt++;
}
}
cout<<'\n';
for(int i=1;i<=3;i++){
if(a[i][1]==a[i][2]&&b[i][1]<b[i][3]&&b[i][2]<b[i][3]){
ok=0;
}
if(a[i][2]==a[i][3]&&b[i][2]<b[i][1]&&b[i][3]<b[i][1]){
ok=0;
}
if(a[i][1]==a[i][3]&&b[i][1]<b[i][2]&&b[i][3]<b[i][2]){
ok=0;
}
if(a[1][i]==a[2][i]&&b[1][i]<b[3][i]&&b[2][i]<b[3][i]){
ok=0;
}
if(a[1][i]==a[3][i]&&b[1][i]<b[2][i]&&b[3][i]<b[2][i]){
ok=0;
}
if(a[2][i]==a[3][i]&&b[2][i]<b[1][i]&&b[3][i]<b[1][i]){
ok=0;
}
}
if(a[1][1]==a[2][2]&&b[1][1]<b[3][3]&&b[2][2]<b[3][3]){
ok=0;
}
if(a[2][2]==a[3][3]&&b[2][2]<b[1][1]&&b[3][3]<b[1][1]){
ok=0;
}
if(a[1][1]==a[3][3]&&b[1][1]<b[2][2]&&b[3][3]<b[2][2]){
ok=0;
}
if(a[1][3]==a[2][2]&&b[1][3]<b[3][1]&&b[2][2]<b[3][1]){
ok=0;
}
if(a[3][1]==a[2][2]&&b[3][1]<b[1][3]&&b[2][2]<b[1][3]){
ok=0;
}
if(a[1][3]==a[3][1]&&b[1][3]<b[2][2]&&b[3][1]<b[2][2]){
ok=0;
}
if(ok==1)fenzi++;
fenmu++;
}while(next_permutation(p+1,p+10));
printf("%.10lf\n",fenzi*1.0/fenmu);
//puts(ans>0?"YES":"NO");
//puts(ans>0?"Yes":"No");
}
\(D - Minimum Width\)
这题也是显然的二分答案,每次 \(check\) 的时候 \(O(n)\) 模拟。
int a[N],n,k;
bool check(int x) {
int now=a[1],h=1;
for(int i=2;i<=n;i++){
if(now+a[i]+1<=x){
now+=a[i]+1;
}else{
now=a[i];
h++;
}
}
return h<=k;
}
int bs1(int l, int r){ //左偏二分
while (l < r){
int mid = (l + r )>> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
void solve(){
n=read(),k=read();
int sum=0,maxx=0;
for(int i=1;i<=n;i++){
a[i]=read();
maxx=max(a[i],maxx);
sum+=a[i];
}
cout<<bs1(maxx,sum*2)<<'\n';
//puts(ans>0?"YES":"NO");
//puts(ans>0?"Yes":"No");
}
\(E - Bus Stops\)
显然对于所有间隔的 \(lcm\) ,余数相同的时候答案应该相同。看到间隔的范围很小,可以自然的想到预处理出 \(lcm\) 内的所有答案,然后就可以 \(O(1)\) 的回答询问。
int n,m,a[N],b[N];
int ans[N];
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
void yuchuli(){
m=1;
for(int i=1;i<=8;i++){
m=m*i/gcd(m,i);
}
for(int i=0;i<=m;i++){
int x=i;
for(int j=1;j<n;j++){
if(x%a[j])x+=a[j]-x%a[j];
x+=b[j];
}
ans[i]=x;
}
}
void solve(){
n=read();
int s=read(),t=read();
for(int i=1;i<n;i++){
a[i]=read();
b[i]=read();
}
yuchuli();
int q=read();
while(q--){
int x=read();
x+=s;
x+=ans[x%m]-x%m;
x+=t;
cout<<x<<'\n';
}
//puts(ans>0?"YES":"NO");
//puts(ans>0?"Yes":"No");
}

浙公网安备 33010602011771号