- A-Detective Book
题意:给出一本书每页谜底揭晓的页数,要求一定要看到谜底揭晓,问这本书要看几天。
模拟计算就行。
#include <cstdio>
const int N = 1e4 + 5 ;
int book[N] ;
int main(){
int n ;
scanf ("%d",&n) ;
for (int i = 1 ; i <= n ; ++ i)
scanf ("%d",&book[i]) ;
int maxs = 0 , count = 0 ;
for (int i= 1 ; i <= n ; ++ i){
if (maxs < book[i]) maxs = book[i] ;
if (maxs == i) ++count ;
}
printf ("%d\n",count) ;
return 0 ;
}
B-Good String
题意:’>‘可以删除这个字符右边的字符(如果’>‘在最左边,就可以一次性把右边所有的全部删除),同样,对于’<‘可以删除这个字符左边的字符(如果’<‘在最右边,也可以将其左边所有的字符全部删除),题目要求通过上面两种变化使得整个字符串只剩下一个字符’>‘或’<’。
题解:找到最左边的’>‘和找到最右边的’<‘,取两者消去字符的最小值。
#include <cstdio>
#include <cstring>
using namespace std ;
int main(){
int n , t ;
char s[105] ;
scanf ("%d",&t) ;
while(t --){
scanf ("%d %s",&n,s) ;
int l , r ;
for (l = 0 ; l < n ; ++ l){
if (s[l] == '>') break ;
}
for (r = n-1 ; r >= 0; --r)
if (s[r] == '<') break ;
r = n - 1 - r ;
printf ("%d\n",r>l?l:r) ;
}
return 0 ;
}
C-playlist
题意:给出曲子数量n,和自己可选的曲子数量k,然后输入曲子的t个和b,要求找到k以下的曲子,并且t的总和乘于b的最小值最大。
题解:
我怎么想也想不到是用优先队列┭┮﹏┭┮,这道题时先用t为关键字升序排列,然后遍历每一首曲子,将t压入优先队列,当选择的曲子数量大于k时,从队列中弹出长度t最小的曲子。
其实也是我没有考虑全,我也是用tb为关键字升序排列,然后当当前的tsum(t的总和) bmin(b的最小值)大于当前的 ans就更新,选到了k首曲子就停止(但是遍历n也没过),因为题解每次都是弹出最小的t,所以保证最后的数是最大的
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std ;
const int N = 3e5 + 5 ;
typedef long long ll ;
struct node{
ll t , b ;
};
bool cmp(node a , node b){
return a.b > b.b ;
}
node song[N] ;
int main(){
int n , k;
cin >> n >> k ;
for (int i = 1 ; i <= n ; ++ i)
cin >> song[i].t >> song[i].b ;
sort(song+1,song+1+n,cmp) ;
ll tsum = 0 , ans = 0 , bmin = 1e6 ;
priority_queue<ll,vector<ll>,greater<ll> > p ;
for (int i = 1 ; i <= n ; ++ i){
p.push(song[i].t) ;
tsum += song[i].t ;
if (i > k){
tsum -= p.top() ;
p.pop() ;
}
bmin = min(bmin,song[i].b) ;
ans = max(ans,bmin * tsum) ;
}
cout << ans << endl ;
return 0 ;
}
- D. Minimum Triangulation
又是一道看不懂题意的题emmmmm,看了题解大概了解了题解,大概就是给出n边形状,要求分割成(n-2)个三角形,花费精力是三角形顶点编号的乘积之和(编号按顺时针给定),求花费最小的精力。
题解:若要使得乘积之和最小,那就要尽量和顶点1连接,然后遍历乘积相加就好(这么简单的题我居然没看懂,我emmmmm)。
#include <cstdio>
int main(){
int n ;
scanf ("%d",&n) ;
int ans = 0 ;
for (int i = 3 ; i <= n ; ++ i){
ans += i*(i-1) ;
}
printf ("%d\n",ans) ;
return 0 ;
}
还有一个大佬的更简洁做法:直接推出结果为(nnn-n)/3-2
#include <cstdio>
int main(){
int n ;
scanf ("%d",&n) ;
printf ("%d\n",(n*n*n-n)/3-2) ;
return 0 ;
}