A题
题意:给出四个数 a,b,c,k.执行k次,每次分为三步(按顺序执行)
- If a > b then a= a − b.
- If b > c then b = b− c.
- If c > a then c = c − a.
求k次后a,b,c分别为多少.
思路:找规律题,每次输出时如果a=b=c break即可,也就是说循环次数经过有限次(次数较少)一定得到a=b=c,k小于这个次数让它循环就行;
AC code
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<queue>
#include<stack>
using namespace std;
int main()
{
int t,a,b,c,k;
cin>>t;
while(t--)
{
cin>>a>>b>>c>>k;
while(k--)
{
if(a>b)a-=b;
if(b>c)b-=c;
if(c>a)c-=a;
if(a==b&&b==c)break;
}
printf("%d %d %d\n",a,b,c);
}
}
E题
题意:给出一个数n,问组成n个正方形框需要多少根火柴.
思路:n中一定包含一个1x1或2x2或3x3…的最大正方形块,我们可以先算出来包含的最大正方形块需要多少根火柴,然后算出还需要几个1x1的小正方形
把小正方形往大的正方形框上搭建即可,搭建时注意两条边每条边开始时的第一个小正方形需要3根火柴,其余的需要两根.
AC code
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<queue>
#include<stack>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
long long int t,n;
cin>>t;
while(t--)
{
cin>>n;
long long int s=0;
long long int q=sqrt(n);//包含的最大正方形框的边长
s+=3*2*(q-1)+4;//正方形框的两条外排小正方形需要的火柴数
s+=(q*q-2*q+1)*2;//正方形框中剩下的小正方形需要的火柴数
n-=q*q;//还需要搭建几个小正方形
if(n>0)//搭建
{
if(n<=q)
{
s+=3;
s+=(n-1)*2;
}
else
{
s+=6;
s+=(n-2)*2;
}
}
printf("%lld\n",s);
}
}
F题
题意:给出一个n,再给出一个nxn的矩阵代表每两个点间的最短距离,重建这个图但保证两点间的最短距离不变,问:最少需要多少条边
思路:【弗洛伊德+标记 】 每两个点间的最短距离有了,重建图时就是把重复的重复的边删去即可,枚举中间点如果距离相等就删去一条边.可能会有疑问中间如果有多个点怎么办,这个是不影响的因为我们每两个点的最短距离都有,如下图删去一条边后两点间的最短距离不变
AC code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
const double pi = acos(-1.0);
#define memset(a,b) memset(a,b,sizeof(a))
const int mod = (1 ? 1000000007 : 998244353);
const int inf = (1 ? 0x3f3f3f3f : 0x7fffffff);
const int dx[] = { -1,0,1,0 }, dy[] = { 0,1,0,-1 };
const ll INF = (1 ? 0x3f3f3f3f3f3f3f3f : 0x7fffffffffffffff);
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll poww(ll a, ll b, ll mod) { ll s = 1; while (b) { if (b & 1)s = (s * a) % mod; a = (a * a) % mod; b >>= 1; }return s % mod; }
const int N = 1e5 + 11;
ll n,m;
int z[305][305];
int vis[305][305];//标记数组
void solve()
{
memset(vis,0);
cin>>n;
long long int o=n*(n-1)/2;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)cin>>z[i][j];
}
for(int k=1;k<=n;k++)//弗洛伊德
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if((z[i][j]==z[i][k]+z[k][j])&&vis[i][j]==0)//距离相等标记,n--
{
if(i==k||j==k||i==j)continue;
//printf("%d %d",i,j);
o--;
vis[i][j]=1;
vis[j][i]=1;
}
// m=0;
// for(int i=1;i<=n;i++)
// {for(int j=1;j<=n;j++)cout<<vis[i][j]<<' ';cout<<endl;}
cout<<o<<endl;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
ll T = 1;
//cin >> T;
while (T--)solve();
//while (cin >> n)solve();//HDU
return 0;
}
G题
题意:t组数据,每组数据x1,y1,x2,y2,x3,y3;判断从点(x1,y1)发出经过(x2,y2)的射线是否经过(x3,y3).
思路:分情况讨论,
1 k不存在.
2 k=0.
3 k存在且不为零
判断(x3,y3)是否在射线上即(x1,y1)与(x2,y2)的斜率和(x1,y1)与(x3,y3)的斜率相等且(x2,y2)和(x3,y3)在(x1,y1)的一边,如图枚举所有情况即可
AC code
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<stack>
#include<queue>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
int a,b,c,d,e,f,t;
cin>>t;
while(t--)
{
cin>>a>>b>>c>>d>>e>>f;
if(e==a&&f==b)printf("YES\n");
else
{
if(a==c)//k不存在
{
int flag=0;
if(((d>b)&&(f>b))||((d<b)&&(f<b)))flag=1;//判断(x2,y2)和(x3,y3)是否在同一边
if(e==a&&flag)printf("YES\n");//
else printf("NO\n");
}
else if(b==d)//k==0
{
int flag=0;
if(((c>a)&&(e>a))||((c<a)&&(e<a)))flag=1;//判断(x2,y2)和(x3,y3)是否在同一边
if(b==f&&flag)printf("YES\n");
else printf("NO\n");
}
else
{
if(a==e)printf("NO\n");//k不存在
else{
if(((c>a)&&(e>a)&&(d>b)&&(f>b))||((c<a)&&(e<a)&&(d<b)&&(f<b))||((c>a)&&(e>a)&&(d<b)&&(f<b))||((c<a)&&(e<a)&&(d>b)&&(f>b)))//判断(x2,y2)和(x3,y3)是否在同一边,四种情况
{
double k1=(d-b)*1.0/(c-a),k2=(f-b)*1.0/(e-a);
if(k1==k2)printf("YES\n");
else printf("NO\n");
}
else printf("NO\n");
}
}
}
}
}
I题
签到题,替换字符串
AC code
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<queue>
#include<stack>
using namespace std;
int main()
{
char a[120000];
memset(a,0,sizeof(a));
cin>>a;
int k=strlen(a);
for(int i=0;i<k-1;i++)
if((a[i]=='i'&&a[i+1]=='g')||(a[i]=='I'&&a[i+1]=='G')||(a[i]=='I'&&a[i+1]=='g'))
{
a[i]='i',a[i+1]='G';
}
printf("%s\n",a);
}
J题
题意:给出一个n 计算不超过cos(((n-1)!+1)/(n)*π)的平方的最大整数
找规律题,只要是素数就能得到π的整数倍即cos(kπ)的平方一定为1,输出不超过一的最大整数,输出1,其他的除了一之外都不能得到π的整数倍,最大值小于1,只能输出零.
AC code
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<queue>
#include<stack>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
long long int t,n;
cin>>t;
while(t--)
{
cin>>n;
if(n==1||n==2||n==3)printf("1\n");
else{
int flag=1,q=sqrt(n);
for(int i=2;i<=q;i++)
if(n%i==0)
{
flag=0;
break;
}
if(flag)printf("1\n");
else printf("0\n");
}
}
}