F.Fountains
求贡献的题,斐波那契数列中奇数和偶数出现规律是奇数、奇数、偶数,奇数和奇数对答案没有贡献,其他组合均有贡献。求出奇数个数为p,则答案为
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll n;scanf("%lld",&n);
ll p=n/3*2+(n%3);
ll res=n*(n-1)/2-p*(p-1)/2;
printf("%lld\n",res);
return 0;
}
B.Mine Sweeper II
A图的反和A图的num相等,B如果能在小于n*m/2步内变成A则直接转换成A,否则转换成A反。
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char a[N][N],b[N][N];
int main(){
int n,m;scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%s",&a[i]);
for(int i=0;i<n;i++) scanf("%s",&b[i]);
int dif=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]!=b[i][j]) dif++;
}
}
if(dif<=m*n/2){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
b[i][j]=a[i][j];
}
}
else{
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
b[i][j]=(a[i][j]=='.'?'X':'.');
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<b[i][j];
}
puts("");
}
return 0;
}
D.Walker
分情况讨论
1.各自独立走完全程,取min
2.对向走完全程,取min
3.二分,枚举间断点mid,p1走[0,mid],p2走[mid,n]
#include<bits/stdc++.h>
using namespace std;
double calc(double n,double p,double v){
return min((n-p+n)/v,(p+n)/v);
}
int main(){
double n,p1,p2;
double v1,v2;
int T;scanf("%d",&T);
while(T--){
scanf("%lf%lf%lf%lf%lf",&n,&p1,&v1,&p2,&v2);
if(p1>p2) swap(p1,p2),swap(v1,v2);
double ans=calc(n,p1,v1);
ans=min(ans,calc(n,p2,v2));
ans=min(ans,max((n-p1)/v1,p2/v2));
double l=p1,r=p2;
for(int i=1;i<=100;i++){
double mid=(l+r)/2.0;
double ans1=calc(mid,p1,v1);
double ans2=calc(n-mid,p2-mid,v2);
ans=min(ans,max(ans1,ans2));
if(ans1<ans2) l=mid;
else r=mid;
}
printf("%.10lf\n",ans);
}
return 0;
}
M.Gitignore
难在建树...
#include<bits/stdc++.h>
using namespace std;
int ans,idx;
int n,m;
struct P{
map<string,int> mp;
int s1=0,s0=0;
void clear(){
s1=0,s0=0;
mp.clear();
}
int ch(string s){
if(mp.count(s)) return mp[s];
else return mp[s]=++idx;
}
}tr[5005];
void insert(int type){
int p=1;
string s="";
char ss[1005];
scanf("%s",ss+1);
for(int i=1;ss[i];i++){
if(ss[i]=='/') p=tr[p].ch(s),s="";
else s=s+ss[i];
}
p=tr[p].ch(s);
type==1?++tr[p].s1:++tr[p].s0;
}
void dfs(int x){
for(auto i:tr[x].mp){
int is=i.second;
dfs(is);
tr[x].s1+=tr[is].s1;
tr[x].s0+=tr[is].s0;
}
if(x==1) return ;
if(tr[x].s1&&!tr[x].s0){
ans++;
for(auto i:tr[x].mp)
ans--;
}
}
void solve(){
for(;idx;idx--){
tr[idx].clear();
}
idx=1,ans=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) insert(1);
for(int i=1;i<=m;i++) insert(0);
dfs(1);
printf("%d\n",ans);
}
int main(){
int T;scanf("%d",&T);
while(T--) solve();
return 0;
}