1090 3个数和为0 1091 线段的重叠 1182 完美字符串 1283 最小周长 1284 2 3 5 7的倍数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1090 3个数和为0 1091 线段的重叠 1182 完美字符串 1283 最小周长 1284 2 3 5 7的倍数相关的知识,希望对你有一定的参考价值。

1090 3个数和为0

给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。
 
Input
第1行,1个数N,N为数组的长度(0 <= N <= 1000)
第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
Output
如果没有符合条件的组合,输出No Solution。
如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。
Input示例
7
-3
-2
-1
0
1
2
3
Output示例
-3 0 3
-3 1 2
-2 -1 3
-2 0 2
-1 0 1
确定两个找第三个,1000000复杂度。
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<map>
 6 #include<cstring>
 7 using namespace std;
 8 
 9 int n;
10 int a[1007];
11 map<int,bool>p;
12 bool boo=0;
13 
14 int main()
15 {
16     scanf("%d",&n);
17     for (int i=1;i<=n;i++)
18     {
19         scanf("%d",&a[i]);
20         p[a[i]]=true;
21     }
22     sort(a+1,a+n+1);
23     for (int i=1;i<=n-2;i++)
24         for (int j=i+1;j<=n-1;j++)
25             if (i!=j)
26             {
27                 int x=0-a[i]-a[j];
28                 if (a[j]<x&&p[x]) 
29                 {
30                     printf("%d %d %d\n",a[i],a[j],x);
31                     boo=1;
32                 }
33             }
34     if (!boo) printf("No Solution\n");        
35 }

1091 线段的重叠

X轴上有N条线段,每条线段包括1个起点和终点。线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]。
给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。
 
Input
第1行:线段的数量N(2 <= N <= 50000)。
第2 - N + 1行:每行2个数,线段的起点和终点。(0 <= s , e <= 10^9)
Output
输出最长重复区间的长度。
Input示例
5
1 5
2 4
2 8
3 7
7 9
Output示例
4
以起点为一号关键字,终点为二号关键字排序,然后发现对于x1,y1,x2,y2,只有一号线条包含二号,相交,不相交三种情况,然后求出最优解,贪心。
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int n;
 9 struct Node
10 {
11     int x,y;
12 }a[50007];
13 
14 bool cmp(Node a,Node b)
15 {
16     if (a.x!=b.x) return a.x<b.x;
17     return a.y<b.y;
18 }
19 int main()
20 {
21     scanf("%d",&n);
22     for (int i=1;i<=n;i++)
23         scanf("%d%d",&a[i].x,&a[i].y);
24     sort(a+1,a+n+1,cmp);
25     int st=a[1].x,ed=a[1].y,ans=0;
26     for (int i=2;i<=n;i++)
27     {
28         if (a[i].x>=ed) st=a[i].x,ed=a[i].y;
29         else if (a[i].y<=ed) ans=max(ans,a[i].y-a[i].x);
30              else
31              {
32                  ans=max(ans,ed-a[i].x);
33                  st=a[i].x,ed=a[i].y;
34              }
35     }
36     printf("%d\n",ans);
37 }

1182 完美字符串

约翰认为字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数。
约翰不在乎字母大小写。(也就是说字母F和f)的完美度相同。给定一个字符串,输出它的最大可能的完美度。例如:dad,你可以将26分配给d,25分配给a,这样整个字符串完美度为77。
Input
输入一个字符串S(S的长度 <= 10000),S中没有除字母外的其他字符。
Output
由你将1-26分配给不同的字母,使得字符串S的完美度最大,输出这个完美度。
Input示例
dad
Output示例
77
注意还有大写,第一次被坑了,简单排序后贪心。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int a[37];
 9 char s[10007];
10 
11 bool cmp(int x,int y)
12 {
13     return x>y;
14 }
15 int main()
16 {
17     scanf("%s",s);
18     int len=strlen(s);
19     for (int i=0;i<len;i++)
20     {
21         if (s[i]>=a&&s[i]<=z) a[s[i]-a]++;
22         else a[s[i]-A]++; 
23     } 
24     sort(a+0,a+25+1,cmp);
25     int ans=0;
26     for (int i=0;i<26;i++)
27         ans+=a[i]*(26-i);    
28     printf("%d\n",ans);    
29 }

1283 最小周长 

一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值。例如:S = 24,那么有{1 24} {2 12} {3 8} {4 6}这4种矩形,其中{4 6}的周长最小,为20。
Input
输入1个数S(1 <= S <= 10^9)。
Output
输出最小周长。
Input示例
24
Output示例
20
发现两个数越相近,周长最小,然后从√S找第一对,贪心就可以了。
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int n;
 9 
10 int main()
11 {
12     scanf("%d",&n);
13     int up=(int)sqrt(n);
14     for (int i=up;i>=1;i--)
15     {
16         int x=n/i;
17         if (x*i==n)
18         {
19             printf("%d\n",(x+i)*2);
20             break;
21         }
22     }
23 } 

1284 2 3 5 7的倍数 

给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。
Input
输入1个数N(1 <= N <= 10^18)。
Output
输出不是2 3 5 7的倍数的数共有多少。
Input示例
10
Output示例
1
简单的容斥原理,不要写错是关键,被坑了好久,只怪自己菜。
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 
 8 typedef long long LL;
 9 
10 LL n;
11 
12 int main()
13 {
14     scanf("%lld",&n);
15     LL x=n/2+n/3+n/5+n/7-n/6-n/10-n/14-n/15-n/21-n/35+n/30+n/42+n/105+n/70-n/210;
16     printf("%lld",n-x);
17 }







以上是关于1090 3个数和为0 1091 线段的重叠 1182 完美字符串 1283 最小周长 1284 2 3 5 7的倍数的主要内容,如果未能解决你的问题,请参考以下文章

1090 3个数和为0(二分)

51nod 1090 3个数和为0二分

51nod 1090 3个数和为0(排序+二分)

51Nod 1091 线段的重叠(贪心+区间相关

1001 数组中和等于K的数对 1090 3个数和为0

51nod 1091 线段的重叠贪心/区间覆盖类