1. 程式人生 > >2019.3.27

2019.3.27

space long prior bre hid code gif include 開始

1.貪心:最優隊列

http://poj.org/problem?id=3253

倒推,最小的兩個和在一起,加入隊列(模擬倒割)

技術分享圖片
#include<iostream>
#include<algorithm>
#include<queue>
#define LL long long
using namespace std;
int f[20005];
priority_queue<int, vector < int > ,greater < int > > q;
int main()
{
  int n;
  cin
>>n; LL ans=0; for(int i=0;i<n;i++) { cin>>f[i]; q.push(f[i]); } while(q.size()>1) { int a=q.top(); q.pop(); int b=q.top(); q.pop(); ans+=a+b; q.push(a+b); } cout<<ans<<endl; return 0; }
POJ 3253

2.貪心:

http://acm.hdu.edu.cn/showproblem.php?pid=2037

按開始時間順序排,然後查找從當前時間到其結束時間內有沒有完整節目,沒有加入答案,並且用now表示該事件的結束時間,讓下一個數一直跳到now為止。

技術分享圖片
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<queue>
 4 #include<cstring>
 5 #define LL long long
 6 #define mem(a) memset(a,0,sizeof(a))
 7
using namespace std; 8 int f[20005]; 9 struct node{ 10 int x,y; 11 }g[105],p; 12 int be[30],ed[30]; 13 int main() 14 { 15 int n; 16 while(cin>>n&&n) 17 { 18 mem(be); 19 int ans=0; 20 for(int i=0;i<n;i++) 21 { 22 cin>>g[i].x>>g[i].y; 23 } 24 for(int i=0;i<n-1;i++) 25 { 26 for(int j=i+1;j<n;j++) 27 { 28 if(g[i].x>g[j].x) 29 { 30 p=g[i]; 31 g[i]=g[j]; 32 g[j]=p; 33 } 34 } 35 } 36 int now=0; 37 for(int i=0;i<n;i++) 38 { 39 if(g[i].x<now) continue; 40 int t=0; 41 for(int j=i+1;j<n;j++) 42 { 43 if(g[j].y<=g[i].y) 44 t++; 45 else if(g[j].y>g[i].y) 46 { 47 if(t) 48 break; 49 } 50 } 51 if(t==0) 52 { 53 ans++; 54 now=g[i].y; 55 } 56 } 57 cout<<ans<<endl; 58 } 59 return 0; 60 }
今年暑假不AC

3.貪心:

寫的很麻煩,找到大於y和小於y的

https://vjudge.net/problem/161026/origin

技術分享圖片
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<queue>
 4 #include<cstring>
 5 #define LL long long
 6 #define mem(a) memset(a,0,sizeof(a))
 7 using namespace std;
 8 int f[1500],g[1005];
 9 int main()
10 {
11   int n,k,p,x,y,b=0,s=0,sum=0;
12   cin>>n>>k>>p>>x>>y;
13   for(int i=1;i<=k;i++)
14    {
15       cin>>f[i];
16       sum+=f[i];
17       if(f[i]>y)b++;
18       else if(f[i]<y) s++;
19    }
20   int t=n-k,v=0;
21   if(sum+t>x) {cout<<"-1"<<endl;return 0;}
22   if(s>=n/2+1) {cout<<"-1"<<endl;return 0;}
23   if(b>n/2) {
24     for(int i=1;i<=t;i++)
25         cout<<"1 ";
26     return 0;
27   }
28   int m=k-s-b;
29   if(m+b>n/2)
30   {
31     for(int i=1;i<=t;i++)
32         cout<<"1 ";
33      sum+=t;
34   }
35 
36   else
37   {
38       for(int i=1;i<=(1+n)/2-b-m;i++)
39       {
40           g[++v]=y;
41           sum+=y;
42       }
43       for(int i=1;i<=n/2-s;i++)
44      {
45         g[++v]=1;
46         sum+=1;
47      }
48   }
49 
50   if(sum>x) {cout<<"-1"<<endl;return 0;}
51   for(int i=1;i<=v;i++)
52     cout<<g[i]<<" ";
53 
54   return 0;
55 }
school marks

2019.3.27