12.2
均分纸牌
P1031 [NOIP2002 提高组] 均分纸牌 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题贪心没有想出来,有时间再看看。。。。。。。。。
砍龙头哈哈哈
P2695 骑士的工作 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题排序+贪心乱搞就行,然后发现了佬的解法,可以优化一点,而且省事

嗯。。。。。。
乒乓球
P1042 [NOIP2003 普及组] 乒乓球 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题应该是记录过,就是用绝对值判断,当时没想出来,挺头疼的。。。。。。。
借教室
P1083 [NOIP2012 提高组] 借教室 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题暴力肯定能算,所以不算难,因为是有关于区间的,所以我想到了线段树,但是发现,佬有更简单的方法,毕竟码线段树很累

#include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m; int diff[1000011],need[1000011],rest[1000011],r[1000011],l[1000011],d[1000011]; bool isok(int x) { memset(diff,0,sizeof(diff)); for(int i=1;i<=x;i++) { diff[l[i]]+=d[i]; diff[r[i]+1]-=d[i]; } for(int i=1;i<=n;i++) { need[i]=need[i-1]+diff[i]; if(need[i]>rest[i])return 0; } return 1; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&rest[i]); for(int i=1;i<=m;i++)scanf("%d%d%d",&d[i],&l[i],&r[i]); int begin=1,end=m; if(isok(m)){cout<<"0";return 0;} while(begin<end) { int mid=(begin+end)/2; if(isok(mid))begin=mid+1; else end=mid; } cout<<"-1"<<endl<<begin; }
属于是差分+二分,很直击重点。。。。。。。。。

浙公网安备 33010602011771号