2017福建省赛 FZU2272~2283
Posted buerdepepeqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017福建省赛 FZU2272~2283相关的知识,希望对你有一定的参考价值。
1.FZU2272 Frog
传送门:http://acm.fzu.edu.cn/problem.php?pid=2272
题意:鸡兔同笼通解
题解:解一个方程组直接输出就行
代码如下:
#include <map> #include <set> #include <cmath> #include <ctime> #include <stack> #include <queue> #include <cstdio> #include <cctype> #include <bitset> #include <string> #include <vector> #include <cstring> #include <iostream> #include <algorithm> #include <functional> #define fuck(x) cout<<"["<<x<<"]"; #define FIN freopen("input.txt","r",stdin); #define FOUT freopen("output.txt","w+",stdout); //#pragma comment(linker, "/STACK:102400000,102400000") using namespace std; typedef long long LL; typedef pair<int, int> PII; const int maxn = 1e5+5; const int INF = 0x3f3f3f3f; const int MOD = 1e9+7; int main(){ #ifndef ONLINE_JUDGE FIN #endif int T; scanf("%d",&T); while(T--){ int n,m; cin>>n>>m; cout<<m/2-n<<" "<<2*n-m/2<<endl; } }
2.FZU2273
传送门:http://acm.fzu.edu.cn/problem.php?pid=2273
题意:给你两个三角形,让你判断三角形是相交,相离,还是包含
题解:计算几何模板题,先判断三角形A有没有点在三角形B里面,三角形B有没有点在三角形A里面,然后分情况讨论即可
代码如下:
#include<iostream> #include<cmath> using namespace std; struct point{ int x,y; }s[5][5]; double m(point a,point b,point c) //叉积 { return ((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)); } bool Judge(point u1,point u2,point v1,point v2) //判断两条线段相交情况 { return (max(u1.x,u2.x)>=min(v1.x,v2.x)&& max(u1.y,u2.y)>=min(v1.y,v2.y)&& max(v1.x,v2.x)>=min(u1.x,u2.x)&& max(v1.y,v2.y)>=min(u1.y,u2.y)&& m(u1,v1,u2)*m(u1,u2,v2)>=0&& m(v1,u1,v2)*m(v1,v2,u2)>=0); } int line_check(int p,int q) //判断两个三角形是否相交 { return (Judge(s[p][0],s[p][1],s[q][0],s[q][1])|| Judge(s[p][0],s[p][1],s[q][1],s[q][2])|| Judge(s[p][0],s[p][1],s[q][0],s[q][2])|| Judge(s[p][1],s[p][2],s[q][0],s[q][1])|| Judge(s[p][1],s[p][2],s[q][1],s[q][2])|| Judge(s[p][1],s[p][2],s[q][0],s[q][2])|| Judge(s[p][0],s[p][2],s[q][0],s[q][1])|| Judge(s[p][0],s[p][2],s[q][1],s[q][2])|| Judge(s[p][0],s[p][2],s[q][0],s[q][2])); } int point_check(int p,int q) // 面积法判断点在三角形内 { double res=fabs(m(s[q][0],s[q][1],s[q][2])); int ans=0; for(int i=0;i<3;i++) { double res1=fabs(m(s[q][0],s[q][1],s[p][i])); double res2=fabs(m(s[q][1],s[q][2],s[p][i])); double res3=fabs(m(s[q][0],s[q][2],s[p][i])); if(res1+res2+res3==res) ans++; } return ans; } int main() { int t; cin>>t; while(t--) { for(int i=0;i<2;i++) for(int j=0;j<3;j++) cin>>s[i][j].x>>s[i][j].y; int ans1=point_check(0,1),ans2=point_check(1,0); if(ans1==0&&ans2==0) //如果两个三角形没有一个点在另一个三角形内 { int ans=line_check(0,1); if(ans==0) cout<<"disjoint"<<endl; // 相离 else cout<<"intersect"<<endl; //相交 } else if(ans1==3||ans2==3) cout<<"contain"<<endl; //否则包含 else cout<<"intersect"<<endl; //相交 } return 0; }
3.FZU2275
传送门:http://acm.fzu.edu.cn/problem.php?pid=2275
题意:Alice有数字A,Bob有数字B,他们两个人可以对数字进行 1.删除最后一个数,2.将整个数字反转这两个操作,Alice想要将她的数字变得和Bob一样,Bob不想Alice的数字变得和她的一样,最后如果Alice变得和Bob一样了,则Alice赢,否则Bob赢,问你谁会赢
题解:1.如果Bob长度比Alice的数字长度长的话,Bob只需要不断反转他的数字即可,Alice不可能赢
2.如果Bob的数字为0的话,Alice一定赢
3.如果Bob的数字是Alice的数字的子串或者Bob数字的反转是Alice数字的子串的话,那么Alice一定赢
代码如下:
#include <map> #include <set> #include <cmath> #include <ctime> #include <stack> #include <queue> #include <cstdio> #include <cctype> #include <bitset> #include <string> #include <vector> #include <cstring> #include <iostream> #include <algorithm> #include <functional> #define fuck(x) cout<<"["<<x<<"]"; #define FIN freopen("input.txt","r",stdin); #define FOUT freopen("output.txt","w+",stdout); //#pragma comment(linker, "/STACK:102400000,102400000") using namespace std; typedef long long LL; typedef pair<int, int> PII; const int maxn = 1e5+5; const int INF = 0x3f3f3f3f; const int MOD = 1e9+7; int Nxt[maxn]; void makeNext(char P[]) { int m = strlen(P); Nxt[0] = 0; for (int q = 1, k = 0; q < m; ++q) { while (k > 0 && P[q] != P[k]) k = Nxt[k - 1]; if (P[q] == P[k]) k++; Nxt[q] = k; } } int kmp(char T[], char P[]) { int n = strlen(T), m = strlen(P); makeNext(P); for (int i = 0, q = 0; i < n; ++i) { while (q > 0 && P[q] != T[i]) q = Nxt[q - 1]; if (P[q] == T[i]) q++; if (q == m) return i - m + 1; //?¥??3é1|,·μ??3é1|ê±ê×???? } return -1;//?¥??꧰ü } int main(){ #ifndef ONLINE_JUDGE FIN #endif char str1[maxn]; char str2[maxn]; char str3[maxn]; int T; scanf("%d",&T); while(T--){ cin>>str1>>str2; int len1=strlen(str1); int len2=strlen(str2); for(int i=0;i<len2;i++){ str3[len2-i-1]=str2[i]; } if(len2==1&&str2[0]==‘0‘){ cout<<"Alice"<<endl; continue; } str3[len2]=‘