每日一题 day18 打卡

Analysis

贪心

假如小A先选最大的[5,4],虽然电脑必须选一个破坏, 我们可以理解为5和4都属于小A的,假如后面未被破坏的最大值无论是和5相关还是和4相关,必然还是属于小A先手。 写个极限情况,假设6个武将的最大值序列依次为[1,2],[3,4],[5,6],电脑肯定要破坏掉这三种选择。后面第四个值无论是哪个组合,小A必然能通过先手在第二次或第三次先选到这两个武将,也就是说选择的总次数不会超过n/2。 因此,只要将武将组合值排序,由大到小依次选择下去,一定会触发小A胜利条件。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #define int long long
 7 #define maxn 500*(500-1)/2+10
 8 using namespace std;
 9 inline int read()
10 {
11     int x=0;
12     bool f=1;
13     char c=getchar();
14     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
15     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
16     if(f) return x;
17     return 0-x;
18 }
19 inline void write(int x)
20 {
21     if(x<0){putchar('-');x=-x;}
22     if(x>9)write(x/10);
23     putchar(x%10+'0');
24 }
25 int n,cnt;
26 struct node
27 {
28     int x,y,val;
29 }inn[maxn];
30 bool book[maxn];
31 inline bool cmp(node x,node y)
32 {
33     return x.val>y.val;
34 }
35 signed main()
36 {
37     n=read();
38     for(int i=1;i<=n-1;i++)
39         for(int j=i+1;j<=n;j++)
40         {
41             cnt++;
42             inn[cnt].val=read();
43             inn[cnt].x=i;
44             inn[cnt].y=j;
45         }
46     sort(inn+1,inn+cnt+1,cmp);
47     for(int i=1;i<=cnt;i++)
48     {
49         if(book[inn[i].x]==0&&book[inn[i].y]==0)
50         {
51             book[inn[i].x]=1;
52             book[inn[i].y]=1;
53         }
54         else
55         {
56             write(1);
57             printf("\n");
58             write(inn[i].val);
59             return 0;
60         }
61     }
62     write(0);
63     return 0;
64 } 

请各位大佬斧正

01-23 08:31