10/24 每周学习总结5

1 Recording the Moolympics S

#include 
#include
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 
#include
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 
#include
#include
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的比赛,争取多参加一下。

你可能感兴趣的:(1024程序员节)