A 拼三角
题目描述
给出6根棍子,能否在选出3根拼成一个三角形的同时剩下的3根也能组成一个三角形?
输入描述:
首先在一行中给出一个 t,1 \le t \le 10^3t,1≤t≤10
3
,代表测试数据的组数
接下来t行,每行给出6个数字代表棍子长度,棍子长度为正且小于10^910
9
输出描述:
在一行中输出 “Yes” or “No”
示例1
输入
复制
2
1 1 1 1 1 1
1 2 3 4 5 6
输出
复制
Yes
No
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
int a[10],b[N];
int v[10];
void solve()
{
for(int i=1;i<=6;i++) cin>>a[i],v[i]=0;
sort(a+1,a+6+1);
for(int i=1;i<=6;i++) for(int j=i+1;j<=6;j++) for(int k=j+1;k<=6;k++) if(a[i]+a[j]>a[k])
{
int t=0;
v[i]=v[j]=v[k]=1;
for(int y=1;y<=6;y++) if(!v[y]) b[++t]=a[y];
if(b[1]+b[2]>b[3])
{
puts("Yes");
return;
}
v[i]=v[j]=v[k]=0;
}
puts("No");
}
signed main()
{
// ios::sync_with_stdio(false);
int T=1;
cin>>T;
while(T--) solve();
return 0;
}
C 消减整数
题目描述
给出一个正整数H,从1开始减,第一次必须减1,每次减的数字都必须和上一次相同或者是上一次的两倍,请问最少需要几次能把H恰好减到0。
输入描述:
第一行给出一个正整数{T}T,1 \le T \le 10^41≤T≤10
4
接下来T行每行一个H,1 \le H \le 10^9H,1≤H≤10
9
输出描述:
每行一个正整数代表最少的次数
示例1
输入
复制
3
3
5
7
输出
复制
2
3
3
C++(clang++11)
ACM模式
1
保存并提交 执行结果自测输入代码调试
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
int n,f[N],a,b;
int flag,ans;
map < int , int > mp;
int lowbit(int x)
{
return x&(-x);
}
int dfs(int x)
{
int sum=0,cnt=1;
for(int i=1;x;i++)
{
if(lowbit(x)==lowbit(cnt)||i==1) x-=cnt;
else
{
cnt<<=1;
x-=cnt;
}
ans++;
}
return ans;
}
void solve()
{
cin>>n;
flag=ans=0;
cout<<dfs(n)<<endl;
}
signed main()
{
// ios::sync_with_stdio(false);
int T=1;
cin>>T;
while(T--) solve();
return 0;
}
E 春游
题目描述
盼望着,盼望着,东风来了,春天脚步近了。
值此大好春光,老师组织了同学们出去划船,划船项目收费如下:
双人船最多坐两人,也可以坐一人,收费{a}a元
三人船最多坐三人,也可以坐两人或者一人,收费{b}b元
本次出游加上带队老师共{n}n人,如何安排能使得花费最小呢?
输入描述:
第一行给出一个正整数 T(1 \le T \le 1000)T(1≤T≤1000),代表测试数据的组数。
接下来 {T}T 行每行给出三个正整数n, a, b,1 \le n,a,b \le 10^9n,a,b,1≤n,a,b≤10
9
,含义如题。
输出描述:
每组输入输出一行,代表最小的花费
示例1
输入
复制
2
2 20 200
3 20 20
输出
复制
20
20
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
int n,a[10],b[10],c[10];
int flag,ans;
void solve()
{
cin>>n>>a[2]>>a[3];
b[2]=n/2;
b[3]=n/3;
c[2]=n-(n/2)*2;
c[3]=n-(n/3)*3;
ans=flag=0;
if(n==1||n==2)
{
cout<<min(a[2],a[3])<<endl;
return;
}
if(n==3)
{
cout<<min(a[2]*2,a[3])<<endl;
}
if(a[2]*3<a[3]*2)
{
ans+=b[2]*a[2];
if(c[2]!=0) ans+=min(a[2],a[3]);
}
else if(a[2]*3<a[3]*2)
{
ans+=b[3]*a[3];
if(c[3]!=0) ans+=min(a[2],a[3]);
}
else
{
if(c[2]==0)
{
cout<<a[2]*b[2]<<endl;
return;
}
if(c[3]==0)
{
cout<<a[3]*b[3]<<endl;
return;
}
ans+=a[2]*b[2]+min(a[2],a[3]);
}
cout<<ans<<endl;
}
signed main()
{
// ios::sync_with_stdio(false);
int T=1;
cin>>T;
while(T--) solve();
return 0;
}
F 五连珠
题目描述
将{1 \sim 25}1∼25混乱的填进两个5 \times 55×5的矩阵里,然后再给出1 \sim 251∼25的一个排列,按照排列依次划去两个矩阵中对应的元素,直到有矩阵被划掉的数字正好是一行一列或者主副对角线时结束。
输出结束时满足条件的是第几个矩阵,若两个矩阵同时满足,输出{0}0。
输入描述:
第一行一个正整数{T}T,代表测试数据的组数, {1≤T≤50}1≤T≤50
每组测试数据先给出两个{5 \times 5}5×5的矩阵,然后在一行中给出{1 \sim 25}1∼25的一个排列
输出描述:
每组数据输出 “0” or “1” or “2”.
示例1
输入
复制
2
03 21 05 15 08
14 10 17 23 04
18 06 22 12 09
24 20 13 07 16
11 25 01 19 02
22 12 15 03 16
11 23 20 14 19
02 17 09 05 07
24 04 10 21 01
06 13 18 25 08
04 14 07 22 02 01 09 17 05 18 19 12 08 21 15 06 10 16 03 24 20 25 13 23 11
03 21 05 15 08
14 10 17 23 04
18 06 22 12 09
24 20 13 07 16
11 25 01 19 02
22 12 15 03 16
11 23 20 14 19
02 17 09 05 07
24 04 10 21 01
06 13 18 25 08
04 14 07 22 02 01 09 17 13 05 18 19 12 08 21 15 06 10 16 03 24 20 25 23 11
输出
复制
2
0
备注:
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
int a[5][55][55],b[55];
int f[5];
int n=5;
map < int , pair < int , int > > mp1,mp2;
int check()
{
f[1]=f[2]=0;
for(int id=1;id<=2;id++)
{
int cnt=0;
int flag1=0,flag2=0;
for(int i=1;i<=5;i++)
{
cnt=0;
for(int j=1;j<=5;j++) cnt+=a[id][i][j];
if(cnt==0) flag1=1;
cnt=0;
for(int j=1;j<=5;j++) cnt+=a[id][j][i];
if(cnt==0) flag2=1;
}
if(flag1+flag2) f[id]=1;
flag1=flag2=0;
cnt=0;
for(int i=1;i<=5;i++) cnt+=a[id][i][i];
if(cnt==0) flag1=1;
cnt=0;
for(int i=1;i<=5;i++) cnt+=a[id][i][6-i];
if(cnt==0) flag2=1;
if(flag1+flag2) f[id]=1;
}
return f[1]+f[2];
}
void solve()
{
mp1.clear(),mp2.clear();
for(int i=1;i<=5;i++) for(int j=1;j<=5;j++)
{
int x;
cin>>x;
a[1][i][j]=x;
mp1[x]=make_pair(i,j);
}
for(int i=1;i<=5;i++) for(int j=1;j<=5;j++)
{
int x;
cin>>x;
a[2][i][j]=x;
mp2[x]=make_pair(i,j);
}
for(int i=1;i<=25;i++) cin>>b[i];
for(int i=1;i<=25;i++)
{
int val=b[i];
a[1][mp1[val].first][mp1[val].second]=0;
a[2][mp2[val].first][mp2[val].second]=0;
// if(i>=5)
// {
if(check())
{
if(f[1]==1&&f[2]==1)
{
puts("0");
return;
}
if(f[1]==1)
{
puts("1");
return;
}
puts("2");
return;
}
// }
}
}
signed main()
{
// ios::sync_with_stdio(false);
int T=1;
cin>>T;
while(T--) solve();
return 0;
}
J 统计个数
题目描述
给出一张N个点M条边的图,假设图中有三个节点分别为a,b,c,若点a和点b之间有边并且b和c之间有边的话,我们就称(a,b,c)为一条线,同时视(c,b,a)和(a,b,c)为同一条线,而对于其他的组合则认为是和(a,b,c)不同的线。
如果(a,b,c)是一条线并且点a和点c之间也有边的话,我们称(a,b,c)构成一个三角,同理我们视由这三个点组成的三角为同一个三角,即(a, b, c)、(a, c, b)、(b, a, c)、(b, c, a)、(c, a, b)、(c, b, a)只能被算一次
请分别统计给定的图中,三角和线的数量
输入描述:
第一行一个正整数T(1\le T \le 50)T(1≤T≤50),代表测试数据的组数
第二行给出一个正整数N, (3 \le N \le 200)N,(3≤N≤200),代表点数,图的节点编号为1 \sim N1∼N
第三行给出一个正整数M, (1 \le M \le \frac{N \times (N-1)}{2})M,(1≤M≤
2
N×(N−1)
),代表图中的边数
接下来M行每行给出两个正整数a_i,b_ia
i
,b
i
,代表a_i,b_ia
i
,b
i
之间有边相连
题目保证图中至少存在一条线并且不存在重边和自环
输出描述:
对于每组数据请输出一个分数代表三角和线数量的比,格式为{p} / {q}p/q,(其中p为三倍的三角的数量,q为线的数量)
请输出最简分数,若{p=0}p=0,则输出{0}/{1}0/1。
示例1
输入
复制
3
5
7
1 2
2 3
1 3
3 4
2 4
4 5
1 5
3
3
1 2
3 1
3 2
4
3
1 2
2 3
3 4
输出
复制
6/13
1/1
0/1
数线的时候,枚举中点即可
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=4*1e5+5;//?????????? 4e8
struct node
{
int ver,next;
}e[N];
int tot,head[N];
int n,m;
int cnt,ans,root;
int v[N],d[505][505];
void add(int x,int y)
{
e[++tot].ver=y;
e[tot].next=head[x];
head[x]=tot;
}
void addedge(int x,int y)
{
add(x,y);add(y,x);
}
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
void init()
{
ans=cnt=tot=0;
memset(head,0,sizeof(head));
memset(v,0,sizeof(v));
memset(d,0,sizeof(d));
}
void solve()
{
init();
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
d[x][y]=d[y][x]=1;
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++)
ans+=d[i][j]*d[j][k]*d[i][k];
for(int x=1;x<=n;x++)
{
int sum=0;
for(int i=head[x];i;i=e[i].next) sum++;
cnt+=sum*(sum-1)/2;
}
ans/=2;
int d=gcd(ans,cnt);
printf("%d/%d\n",ans/d,cnt/d);
}
signed main()
{
// ios::sync_with_stdio(false);
int T=1;
cin>>T;
while(T--) solve();
return 0;
}