1 Recording the Moolympics S
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long int_1;
int n;
struct node{
int_1 begin_b;
int_1 end_e;
}a[300];
bool cmp(node a,node b){
if(a.end_e==b.end_e)return a.begin_b>b.begin_b;
return a.end_e<b.end_e;
}
void swap(int &a,int &b){
int c=a;
a=b;
b=c;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i].begin_b;
cin>>a[i].end_e;
}
sort(a,a+n,cmp);
int re=0,rt=0;
int t1=-1,t2=-1;
for(int j=0;j<n;j++)
{if(t1<=a[j].begin_b){
re++;
t1=a[j].end_e;
}
else if(t2<=a[j].begin_b){
rt++;
t2=a[j].end_e;
swap(t1,t2);
}
}
cout<<re+rt<<endl;
}
题意:要求用两个摄像头拍摄最多的视频。
题解:刚开始做这道题,我想可以分别计算2个摄像头拍摄的视频,主题代码如下
struct node{
int_1 begin_b;
int_1 end_e;
int flag;
}a[300];
for(int i=0;i<2;i++){
tt=ex();
a[tt].flag=1;
for(int j=1;j<n;j++){
if(a[j].begin_b>=a[tt].end_e&&a[j].flag==0){
count++;
a[j].flag=1;
tt=j;
}else{
continue;
}}}
看这道题时感觉很眼熟,想暴力破解,排序方式是开始时间短的排在前面,若开始时间相同,则结束时间早的先排。我想先优先选出第一个摄像头,然后将选出的视频设置标记,然后遍历第二个摄像头即可,但是答案是错误的,错误原因想了很久没想到,大概是想简单了,假如第一个节目很长,很显然不能选。如果按照结束时间早的排,就不会出现这个问题。算法思路是,第一摄像头必须存结束时间长的,能存则先存。防止第二个摄像头的存不了。
2 Sequence 序列问题
#include <iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
const ll maxn=1e7+3;
ll n;
ll a[maxn];
/*ll max(ll a,ll b){
return a>b?a:b;
}*/
int main()
{cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
ll sum=0;
for(int i=1;i<=n;i++){
if(i>1&&a[i-1]<a[i])
{sum+=a[i];
}
if(i<n&&a[i+1]<=a[i]){
sum+=a[i];
}
}
cout<<sum<<endl;
}
题解:要求解最少需要多少代价,代价是max(a[i],a[i-1]).
解析:刚开始看题以为从小到大排个序,再加除第一个数以外的数,就是最少的代价,仔细看题才发现,顺序不允许打乱。不过我最后居然卡在了sum求和的过程,sum必须也得是longlong类型(小失误)。这道题的贪心思路是:要求最小代价,每一个数最多被允许被加2次,操作方式只需要该数左边的数如果小于该数,加一次,或者右边的数小于该数,则加一次。
补充:
今天打了codeforce,感觉好久没有打比赛了,简单题都不会做了,特别是第二题,我感觉一直没问题,不知道为什么一直wa3,看了别人的代码,发现和我写的差不多,感觉自己很迷。
#include <iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int sum;
int t1;
struct node{
int data;
}a[1001];
int fun(int b)
{ int ans=1;
for(int i=1;i<=b;i++){
ans=ans*2;
}
return ans;
}
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i].data;
t1=0;
sum=0;
for(int i=0;i<n;i++){
if(a[i].data==1){
t1++;
}
if(a[i].data==0){
sum++;
}
}
cout<<t1*fun(sum)<<endl;
}
}
补充:
在cf看了一下数据,原来是后面数据过大,大于int类型最大值,把int 改成long long类型就行了。
总结:
目前的状态是难题不会,简单的题粗心。好久没打cf了,打了才知道自己多么菜,之前一直想先学一段时间才打,看来需要改变策略了,之后如果有div2或者有div3的比赛,争取多参加一下。