problema(hdu2037)
這道解題,是希望看到節目盡可能多,那麼安排好前面的節目後,如果剩下的時間更多,能選擇的節目就更多。
所以貪心策略是對每個節目的結束時間排序,目的是使剩餘時間留下,再判斷還能看幾個節目。對節目時間的排序結束後,依次判斷,這次要看的節目的開始時間是否大於上次看的節目的結束時間,若是大於,則這個節目時可以完整**的,若是小於則是不能完整**的,所以跳到下乙個節目繼續判斷 。
#include
#include
using
namespace
std;
int n;
struct show
pro[110];
bool cmp(show a,show b)
sort(pro,pro+n,cmp);
int tmp=pro[0].e;
for(i=1;iif(pro[i].s>=tmp)
}printf("%d\n",cnt);
}return
0;}
problemb(hdu4310)
要求掉的血最少,應該要從攻擊力/血量(掉血速度)最大的先殺,因為你每次打敵人一滴血就要相應減去還存在的敵人的攻擊和的血量,所以肯定要從攻擊力/血量大的開始,才能得到掉的最低血量。
也就是對攻擊力/血量排序,再直接按順序打,將損失的血量算出來就好。
#include
#include
using
namespace
std;
struct per
p[30];
int cmp(const per &a,const per &b)
int main()
sort(p,p+n,cmp);
for (i=0;icout
0;}
problemc(hdu1789)
扣分大的當然要想辦法做掉。所以對分數按從大到小排次序,然後列舉限定的時間,若是某一天沒有被標記,就用這一天來完成這一門作業,若是列舉到0了,說明在限定時間內沒有哪一天可以完成這門作業,那麼就扣除這門課的分數。當然完成的日期要倒著列舉,也就是說盡量把前面的日子空出來,以應對後面更多的作業。
#include
#include
#include
#include
using
namespace
std;
struct ss
t[100000];
int f[100000];
int cmp(const ss a,const ss b)
int main()
if(j==0)
sum+=t[i].p;
}printf("%d\n",sum);
}return
0;}
problemd(hdu4864)
將任務以x從大到小排序(x相同時以y從大到小排序)。然後也用相同排序方法排序機器。開始遍歷任務,找出所有xi(xi>=xj),從中選擇yi最小的乙個作為這個任務的執行機器。為什麼這麼貪心,因為若還存在任務(xk,yk)使得這個機器能被使用,但xj>=xk,所以獲得金錢更多,優先選擇j;若k不能使用這個機器,那麼必定也就不存在其他機器能被使用,除非是新加入的機器,但新加入的必定不能完成任務j,所以完成任務保證了最多。
這裡曾有人問我為什麼先按x排再按y排一定可以保證最優,憑什麼不是y先排?請看資料,價值為500*x+2*y,而y的範圍最大只有100。y最大幅度的增加帶來的價值還不如x加1。當然是按x排咯。
#include
#include
#include
#include
#include
using
namespace
std;
#define ll __int64
const
int maxn=1e5+10;
struct nodee[maxn],f[maxn];
int c[101];
int cmp(node a,node b)
int main()
for(k=f[i].y;k<=100;k++)}}
printf("%d %i64d\n",num,ans);
}return
0;}
probleme(poj1017)
由於盒子和箱子的高均為h,因此只需考慮底面積的空間。
6*6的盒子,每個盒子獨佔乙個箱子。
5*5的盒子,每個盒子放入乙個箱子,該箱子的剩餘空間允許放入的最大尺寸為1*1,且最多放11個。
4*4的盒子,每個盒子放入乙個箱子,該箱子的剩餘空間允許放入的最大尺寸為2*2。
3*3的盒子,每4個剛好獨佔乙個箱子,不足4個3*3的,剩下空間由2*2和1*2填充。
2*2的盒子和1*1的盒子主要用於填充其他箱子的剩餘空間,填充後的多餘部分才開闢新箱子裝填。
#include
#include
using namespace std;
int main()
,a[10];
//3×3的放完後,餘下的放入新箱子後,還可以放幾個2×2的包裹(下標對應餘數)
while(1)
if(sum==0)
break;
sum=0;
sum=a[4]+a[5]+a[6]+a[3]/4;
if(a[3]%4!=0) sum++;
int need2=a[4]*5+p[a[3]%4];
if(need22])
int need1=sum*36-a[2]*4-a[3]*9-a[4]*16-a[5]*25-a[6]*36;
//需要的1×1的個數,即所有箱子的總面積減去後5種盒子的總面積
if(need11])
printf("%d\n",sum);
}return
0;}
7 5 實驗 解題參考
problem a hdu1157 排序水題,將輸入資料排序用一次sort,輸出中位數即直接輸入第n 2個位置上的數。include include include using namespace std int a 10010 int main return 0 problem b hdu1106...
7 14 實驗 解題參考
problema hdu1215 problemb hdu1286 這兩題是上課例題,不再贅述了。problemc hdu1406 一 這題的資料可以直接判斷,在num1和num2之間的數是否符合要求。但有個巨坑需要注意,num1和num2不一定是大小順序給出的!二 但既然學會了篩選法,很明顯可以看...
程式設計實驗 期末模擬 解題報告
1001 題目大意 搜尋某個數字在一串數中第一次出現的位置,如果沒有則輸出 1 解題思路 簡單的搜尋題,直接遍歷整個陣列,如下 includeint main 1004 題目大意 檢驗字串是否合法 解題思路 逐位判斷 include includeint valid char s int main ...