Tin học Triangle.cpp

Lưu Duy Quang

Học sinh mới
Thành viên
3 Tháng chín 2018
2
0
1
19
Đà Nẵng
THCS Trần Đại Nghĩa
[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

Đếm tam giác

Cho 3 dãy số dương A, B, C cùng có N phần tử. Hãy đếm xem có bao nhiêu bộ3 sốA, B[j] và C[k] mà 3 số này là 3 cạnh của 1 tam giác.
Dữ liệu vào: từ file TRIANGLE.INP với cấu trúc:
- Dòng đầu chứa số nguyên dương N (N≤1000)
- Dòng thứ hai chứa các số A1, A2, ..., AN.
- Dòng thứ ba chứa các số B1, B2, ..., BN.
- Dòng thứ tư chứa các số C1, C2, ..., CN.
Các số Ai, Bi, Ci đều không vượt quá 109 và được ghi cách nhau bởi dấu cách.
Kết quả: file văn bản TRIANGLE.OUT gồm một sốS duy nhất là sốlượng bộba sốtìm
được.

Test
InputOutput
2
2 3
3 1
4 7
2
3
2 3 1
4 4 9
8 5 2
8
[TBODY] [/TBODY]

Thật sự mình cũng làm rồi mà không biết sai ở đâu:


#include <stdio.h>
#include <algorithm>
#include <stdlib.h>

using namespace std;

long long n,i,j,first,final,l,r,m,ans=0;
long long a[100000],b[100000],c[100000];

long long cnp(long long x)
{
l=1; r=n;
while (r>=l)
{
m=(l+r)/2;
if (c[m]>x) r=m-1;
else l=m+1;
}
return l;
}

long long tknp(long long y)
{
l=1; r=n;
while (r>=l)
{
m=(l+r)/2;
if (c[m]>y) r=m-1;
else l=m+1;
}
return l;
}

int main()
{
scanf("%lld",&n);
for (i=1;i<=n;i++) scanf("%lld",&a);
for (i=1;i<=n;i++) scanf("%lld",&b);
for (i=1;i<=n;i++) scanf("%lld",&c);
sort(a+1,a+n+1);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (abs(a-b[j])<c[n])
if (a+b[j]>c[1])
{
first=cnp(abs(a-b[j]));
final=tknp(a+b[j]);
}
if (final>=first) ans=ans+final-first+1;
printf("%lld %lld\n",first,final);
}
printf("%lld",ans);
}
 

Cao Hải Dương

Banned
Banned
27 Tháng bảy 2018
264
233
66
18
Lào Cai
Trường gì còn lâu mới biết
Đếm tam giác

Cho 3 dãy số dương A, B, C cùng có N phần tử. Hãy đếm xem có bao nhiêu bộ3 sốA, B[j] và C[k] mà 3 số này là 3 cạnh của 1 tam giác.
Dữ liệu vào: từ file TRIANGLE.INP với cấu trúc:
- Dòng đầu chứa số nguyên dương N (N≤1000)
- Dòng thứ hai chứa các số A1, A2, ..., AN.
- Dòng thứ ba chứa các số B1, B2, ..., BN.
- Dòng thứ tư chứa các số C1, C2, ..., CN.
Các số Ai, Bi, Ci đều không vượt quá 109 và được ghi cách nhau bởi dấu cách.
Kết quả: file văn bản TRIANGLE.OUT gồm một sốS duy nhất là sốlượng bộba sốtìm
được.

Test
InputOutput
2
2 3
3 1
4 7
2
3
2 3 1
4 4 9
8 5 2
8
[TBODY] [/TBODY]
Thật sự mình cũng làm rồi mà không biết sai ở đâu:


#include <stdio.h>
#include <algorithm>
#include <stdlib.h>

using namespace std;

long long n,i,j,first,final,l,r,m,ans=0;
long long a[100000],b[100000],c[100000];

long long cnp(long long x)
{
l=1; r=n;
while (r>=l)
{
m=(l+r)/2;
if (c[m]>x) r=m-1;
else l=m+1;
}
return l;
}

long long tknp(long long y)
{
l=1; r=n;
while (r>=l)
{
m=(l+r)/2;
if (c[m]>y) r=m-1;
else l=m+1;
}
return l;
}

int main()
{
scanf("%lld",&n);
for (i=1;i<=n;i++) scanf("%lld",&a);
for (i=1;i<=n;i++) scanf("%lld",&b);
for (i=1;i<=n;i++) scanf("%lld",&c);
sort(a+1,a+n+1);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (abs(a-b[j])<c[n])
if (a+b[j]>c[1])
{
first=cnp(abs(a-b[j]));
final=tknp(a+b[j]);
}
if (final>=first) ans=ans+final-first+1;
printf("%lld %lld\n",first,final);
}
printf("%lld",ans);
}
bạn chụp ảnh đi chứ chữ này ai hiểu
 
  • Like
Reactions: Lưu Duy Quang

Lưu Duy Quang

Học sinh mới
Thành viên
3 Tháng chín 2018
2
0
1
19
Đà Nẵng
THCS Trần Đại Nghĩa
bạn chụp ảnh đi chứ chữ này ai hiểu
Ừ, thật sự mình cũng ko hiểu. Tại khi đó nó bị lỗi gì ấy nên làm mấy tab đầu dòng mất hết. Mình sửa lại cho dễ đọc rồi đây:



#include <stdio.h>
#include <algorithm>
#include <stdlib.h>

using namespace std;

long long n,i,j,first,final,l,r,m,ans=0;
long long a[100000],b[100000],c[100000];
long long cnp(long long x)
{
l=1; r=n;
while (r>=l)
{
m=(l+r)/2;
if (c[m]>x) r=m-1;
else l=m+1;
}
return l;
}

long long tknp(long long y)
{
l=1; r=n;
while (r>=l)
{
m=(l+r)/2;
if (c[m]>y) r=m-1;
else l=m+1;
}
return l;
}

int main()
{
scanf("%lld",&n);
for (i=1;i<=n;i++) scanf("%lld",&a);
for (i=1;i<=n;i++) scanf("%lld",&b);
for (i=1;i<=n;i++) scanf("%lld",&c);
sort(a+1,a+n+1);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (abs(a-b[j])<c[n])
if (a+b[j]>c[1])
{
first=cnp(abs(a-b[j]));
final=tknp(a+b[j]);
}
if (final>=first) ans=ans+final-first+1;
}
printf("%lld",ans);
}
 

TuanMinhZzz

Học sinh mới
Thành viên
7 Tháng mười một 2021
1
0
1
21
Ninh Bình
Bạn có thể dùng thuật toán two pointer rồi kết hợp với mảng cộng dồn prefix sum để giải quyết và tối ưu thời gian
 
Top Bottom