【ABC】151題解
阿新 • • 發佈:2021-06-15
竟然順利地AK了,爽到(
A
語法題
#include<bits/stdc++.h>
using namespace std;
int main(){
char ch; cin>>ch;
cout<<(char)(ch+1);
return 0;
}
B
簡單的判斷
#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; #define endl '\n' #define debug(x) cerr << #x << ": " << x << endl #define pb(a) push_back(a) #define set0(a) memset(a,0,sizeof(a)) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define dwn(i,a,b) for(int i=(a);i>=(b);i--) #define ceil(a,b) (a+(b-1))/b #define INF 0x3f3f3f3f #define ll_INF 0x7f7f7f7f7f7f7f7f typedef long long ll; typedef pair<int,int> PII; typedef pair<double,double> PDD; inline void read(int &x) { int s=0;x=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar(); x*=s; } int main(){ int n, k, m; cin>>n>>k>>m; int sum=0; rep(i,1,n-1){ int t; cin>>t; sum+=t; } if(sum+k<n*m) puts("-1"); else{ cout<<(n*m-sum>0? n*m-sum: 0)<<endl; } return 0; }
C
簡單的模擬
#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; #define endl '\n' #define debug(x) cerr << #x << ": " << x << endl #define pb(a) push_back(a) #define set0(a) memset(a,0,sizeof(a)) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define dwn(i,a,b) for(int i=(a);i>=(b);i--) #define ceil(a,b) (a+(b-1))/b #define INF 0x3f3f3f3f #define ll_INF 0x7f7f7f7f7f7f7f7f typedef long long ll; typedef pair<int,int> PII; typedef pair<double,double> PDD; inline void read(int &x) { int s=0;x=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar(); x*=s; } const int N=1e5+5; bool ok[N]; int main(){ int n, m; cin>>n>>m; int ac=0, pe[n+1]={0}; rep(i,1,m){ int id; string op; cin>>id>>op; if(op=="AC" && !ok[id]){ ok[id]=true; ac++; } else if(op=="WA" && !ok[id]) pe[id]++; } int pen=0; rep(i,1,n) if(ok[i]) pen+=pe[i]; cout<<ac<<' '<<pen<<endl; return 0; }
D
看到範圍,直接上bfs即可
#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; #define endl '\n' #define debug(x) cerr << #x << ": " << x << endl #define pb(a) push_back(a) #define set0(a) memset(a,0,sizeof(a)) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define dwn(i,a,b) for(int i=(a);i>=(b);i--) #define ceil(a,b) (a+(b-1))/b #define INF 0x3f3f3f3f #define ll_INF 0x7f7f7f7f7f7f7f7f typedef long long ll; typedef pair<int,int> PII; typedef pair<double,double> PDD; inline void read(int &x) { int s=0;x=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar(); x*=s; } #define x first #define y second const int N=25; int n, m; char g[N][N]; PII q[N*N]; bool vis[N][N]; int d[N][N]; int bfs(int sx, int sy, int tx, int ty){ if(sx==tx && sy==ty) return 0; memset(vis, false, sizeof vis); memset(d, 0x3f, sizeof d); int hh=0, tt=-1; q[++tt]={sx, sy}, d[sx][sy]=0; int dx[]={1, 0, -1, 0}, dy[]={0, 1, 0, -1}; while(tt>=hh){ auto hd=q[hh++]; int x=hd.x, y=hd.y; rep(i,0,3){ int kx=x+dx[i], ky=y+dy[i]; if(g[kx][ky]=='#' || vis[kx][ky]) continue; if(kx<1 || kx>n || ky<1 || ky>m) continue; vis[kx][ky]=true; d[kx][ky]=d[x][y]+1; if(kx==tx && ky==ty) return d[kx][ky]; q[++tt]={kx, ky}; } } return -1; } int main(){ cin>>n>>m; rep(i,1,n) rep(j,1,m) cin>>g[i][j]; int res=-1; rep(i,1,n) rep(j,1,m) rep(r,1,n) rep(c,1,m){ if(g[i][j]=='#' || g[r][c]=='#') continue; res=max(res, bfs(i, j, r, c)); } cout<<res<<endl; return 0; }
E
考慮每個數可以造成的貢獻,我們考察第 \(i\) 個數(這個數本身自然是被選取了),有三種情況:
- 如果這個數的左右的數都有選取,那麼貢獻為 \(0\)
- 如果選取的數在該數左邊,那麼貢獻為 \(C_{i-1}^{k-1}w_i\)
- 如果選取的數在該數右邊,那麼貢獻為 \(-C_{n-i}^{k-1}w_i\)
直接統計就行了:
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
inline void read(int &x) {
int s=0;x=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
x*=s;
}
const int N=1e5+5, mod=1e9+7;
ll fpow(ll x,ll p)
{
ll res=1;
for(;p;p>>=1,x=x*x%mod)
if(p&1)res=res*x%mod;
return res%mod;
}
ll inv(ll x){
return fpow(x,mod-2)%mod;
}
ll fac[N];
void init(){
fac[0]=1;
for(int i=1; i<N; i++) fac[i]=fac[i-1]*i%mod;
}
ll C(ll a, ll b){
return fac[a]*inv(fac[b])%mod*inv(fac[a-b])%mod;
}
int w[N];
int main(){
init();
int n, k; cin>>n>>k;
rep(i,1,n) cin>>w[i];
sort(w+1, w+1+n);
ll res=0;
rep(i,1,n){
ll a=0, b=0;
if(k-1<=i-1) a=C(i-1, k-1);
if(n-i>=k-1) b=C(n-i, k-1);
res=(1LL*(a-b)*w[i]+res)%mod;
}
cout<<res<<endl;
return 0;
}
F
似乎是最小圓覆蓋的板子題,但我直接用模擬退火搞了hh
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
inline void read(int &x) {
int s=0;x=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
x*=s;
}
#define x first
#define y second
const double eps=1e-12;
const int N=55;
int n;
PDD q[N];
double ans=1e5;
double rand(double l, double r){
return (double)rand()/RAND_MAX*(r-l)+l;
}
double get_dist(PDD u, PDD v){
return sqrt((u.x-v.x)*(u.x-v.x)+(u.y-v.y)*(u.y-v.y));
}
double calc(PDD p){
double res=0;
rep(i,1,n) res=max(res, get_dist(p, q[i]));
ans=min(ans, res);
return res;
}
void anneal(){
double ax=0, ay=0;
rep(i,1,n) ax+=q[i].x, ay+=q[i].y;
ax/=n, ay/=n;
PDD cur(ax, ay);
for(double t=500; t>1e-4; t*=0.992){
PDD np(rand(cur.x-t, cur.x+t), rand(cur.y-t, cur.y+t));
double dt=calc(np)-calc(cur);
if(exp(-dt/t)>rand(0, 1)) cur=np;
}
}
int main(){
cin>>n;
rep(i,1,n){
double x, y; cin>>x>>y;
x-=500, y-=500;
q[i]={x, y};
}
random_shuffle(q+1, q+1+n);
rep(i,1,100) anneal();
printf("%.10lf", ans);
return 0;
}