版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
总结:
小组4/3/2题 ,有待提升,不过相比上次的0/1/1的情况已经好多了。
缺点:
- 英语阅读不行。
- 题目做得太少。
A. Detective Book
思路:熟悉的题目,不知道哪里做过,遍历取最大值,与i相等时ans++。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("Yes") ;}
void put2(){ puts("No") ;}
const int manx=2e5+5;
ll a[manx];
int main()
{
ll n;
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
ll ans=0,res=-1;
for(int i=1;i<=n;i++)
{
if(res!=a[i]) res=max(res,a[i]);
if(res==i) ans++;
}
cout<<ans<<endl;
return 0;
}
B. Detective Book
思路:真的熟悉二连发,取min(左边最近的>,右边最远的<)。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("Yes") ;}
void put2(){ puts("No") ;}
const int manx=2e5+5;
ll a[manx];
int main()
{
ll q;
q=read();
while(q--)
{
string s;
int n;
cin>>n>>s;
int l=0,r=0;
for(int i=0;i<n;i++) if(s[i]!='>') l++;
else break;
for(int i=n-1;i>=0;i--) if(s[i]!='<') r++;
else break;
cout<<min(l,r)<<endl;
}
return 0;
}
C - Playlist
思路:周二的时候虚拟打了一场div3,里面的1249B2跟这题有异曲同工之妙,先对美丽值排序,然后用优先队列维护长度,当队列元素满足k个时,弹出顶端的长度最小值。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("Yes") ;}
void put2(){ puts("No") ;}
const int manx=3e5+5;
struct node{
ll l,r;
}a[manx];
bool cmp(node a, node b)
{
if(a.r==b.r) return a.l<b.l;
else return a.r>b.r;
}
int main()
{
ll n,m;
n=read();
m=read();
for(int i=1;i<=n;i++)
a[i].l=read(),a[i].r=read();
sort(a+1,a+1+n,cmp);
priority_queue<ll>q;
ll ans=0,res,ans1,ans2=0;
for(int i=1;i<=n;i++){
res=a[i].r;
while(q.size()==m){
ans-=q.top()*(-1);
q.pop();
}
q.push(-a[i].l);
ans+=a[i].l;
ans1=ans*res;
if(ans1>ans2) ans2=ans1;
}
cout<<ans2<<endl;
return 0;
}
D - Minimum Triangulation
思路:画图,画出3456的情况,可以发现每次跟1相连便是最小的答案。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("Yes") ;}
void put2(){ puts("No") ;}
const int manx=1e3+5;
ll a[manx];
int main()
{
ll n=read();
a[3]=6;
a[4]=18;
for(int i=5;i<=n;i++) a[i]=a[i-1]+i*(i-1);
cout<<a[n]<<endl;
return 0;
}