B.减成一
Solution
答案为差分数组-1之后仍大于0的数之和。
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 1e6 + 5;
int a[N],d[N],n;
void solve(){
cin>>n;
ll ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]--;
d[i]=a[i]-a[i-1];
ans+=max(0,d[i]);
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;cin>>T;
while(T--){
solve();
}
return 0;
}C.面积
Solution
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 1e6 + 5;
const double PI = 3.14;
int main(){
int T;cin>>T;
while(T--){
ll x;cin>>x;
printf("%.2f\n",1.0*x*x+1.57*x*x);
}
return 0;
}E.赛马
Solution
排个序贪心比大小。
贪心方案:
- 从我方大的马和敌方大的马开始比,若我方的马比敌方的大,则贡献值+1,换到对方下一匹马,换到我放下一匹马。
- 我方最大的马都输了,则换到对方下一匹马,我方不变。
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 1e6 + 5;
int n,a[N],b[N];
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
ll ans=0,pos=n;
for(int i=n;i>=1&&pos>=1;i--){
if(a[i]>b[pos]) ans++;
else i++;
pos--;
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;cin>>T;
while(T--){
solve();
}
return 0;
}F.三角形
Solution
最优构造方案fibonacci数列,打个表,二分查表。
坑点:开ull,注意数据溢出。
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 1e6 + 5;
ull f[N],n,s[N];
void solve(){
ull a;cin>>a;
cout<<upper_bound(s+1,s+1+n,a)-s-1-(a==18446744073709551615u)<<'\n';
}
void init(){
ull END=18446744073709551615u;
f[1]=1,f[2]=1,s[1]=1,s[2]=2;
for(int i=3;s[i]<=END;i++){
f[i]=f[i-1]+f[i-2];
s[i]=s[i-1]+f[i];
if(s[i]<s[i-1]) break;
n=i;
}
s[++n]=18446744073709551615u;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;cin>>T;
init();
while(T--){
solve();
}
return 0;
}H.直线
Solution
结论题,答案为,最优方案每条线都和别的线相交,则每条线的贡献值为
,总共有
条线,考虑容斥,同一根线算了两次。
数据范围要用大数,那就写个python吧。
Code
n=int(input())
i=0
while i < n:
a=int(input())
print (int(a*(a-1)//2))
i=i+1J.最大值
Solution
标答给的是kmp,然而蒟蒻的我还没学过kmp,那就哈希字符串吧。因为最大长度是递增的,所以每次比较已记录值的下一位即可。
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 1e5 + 5;
int n,len;
char s[N];
unsigned long long H[N],P[N],base=131;
unsigned long long calc(int x,int len){
return H[x+len-1]-H[x-1]*P[len];
}
void solve(){
cin>>s+1;
int n=strlen(s+1);
P[0]=1;
for(int i=1;i<=n;i++){
H[i]=H[i-1]*base+s[i]-'a'+1;
P[i]=P[i-1]*base;
}
len=1;
for(int i=2;i<=n;i++)
while(H[len]==calc(i,len)) len++;
cout<<len-1<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;cin>>T;
while(T--) solve();
return 0;
}
京公网安备 11010502036488号