Clockwise or Counterclockwise
题意:按顺序依次给出A,B,C三个点的坐标,判断这三个点的顺序是顺时针还是逆时针。
思路:利用向量的叉乘进行借用右手螺旋定则判断。
通过判断向量ABX向量AC的符号进行判断,如果大于0,说明是逆时针方向,反之则为顺时针方向。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
ll x1,x2,x3,y1,y2,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
if((x2-x1)*(y3-y2)>(x3-x2)*(y2-y1)) cout<<"Counterclockwise"<<endl;
else cout<<"Clockwise"<<endl;
}
return 0;
}Fluctuation Limit
题意:给出n个区间,再这n个区间内选择各选择一个数,使得这些数两两之间的差值不会超过k。
思路:差分约束。先从左到右进行约束,将区间左端点往大的约束,将右端点往小的约束。然后对约束好的每个区间,从右边往左边进行约束,每次约束之后判断当前的约束的区间左右端的位置关系,左端大于右端则说明不存在。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll l[100010],r[100010];
ll up[100010],down[100010];
void solve(){
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++) cin>>l[i]>>r[i];
bool flag=false;
down[0]=l[0],up[0]=r[0];
for(int i=1;i<n;i++){
down[i]=max(down[i-1]-k,l[i]),up[i]=min(r[i],up[i-1]+k);
if(down[i]>up[i]) flag=true;
}
for(int i=n-2;i>=0;i--){
down[i]=max(down[i+1]-k,down[i]),up[i]=min(up[i+1]+k,up[i]);
if(up[i]<down[i]) flag=true;
}
if(flag) cout<<"NO"<<endl;
else{
cout<<"YES"<<endl;
for(int i=0;i<n;i++) {
cout<<down[i];
if(i<n-1) cout<<" ";
}
cout<<endl;
}
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}Hexagon
题意:
给出一个半径为n的上图这种的往外拓扑的图形,要求输出一种遍历的路径,使得这些遍历的路径转弯的次数最多,并且每个小六边形只能遍历一次,输出一种遍历方案。
思路:打表找规律。通过找规律可以发现对n进行奇数和偶数次的划分。n=2时,一种遍历方案时3 4 5 6 1 2,n=4时,一种遍历方案是(3) 4 2 4 2 (4) 5 3 5 3 (5) 6 4 6 4 (6) 1 5 1 5 (1) 2 6 2 6 (2) 3 1 3 4 (3) (4) (5) (6) (1) (3)n=3时,一种遍历方案为(3) (4) 2 4 (5) 3 5 (6) 4 6 1 5 1 2 6 2 3 4 n=5时,一种遍历方案为3 4 2 4 2 4 2 4 5 3 5 3 5 3 5 6 4 6 4 6 4 6 1 5 1 5 1 5 1 2 6 2 6 2 6 2 3 1 3 1 3 4 3 4 2 4 5 3 5 6 4 6 1 5 1 2 6 2 3 4。
#include<bits/stdc++.h>
using namespace std;
int n;
void odd(){
for(int k=n-2;k>=1;k-=2){
int a=4,b=2;
cout<<"3";
for(int t=1;t<=5;t++){
for(int i=1;i<=k;i++){
cout<<a<<b;
}
cout<<a;
a++,b++;
if(a>6) a=1;
if(b>6) b=1;
}
cout<<a;
for(int i=1;i<=k-1;i++) {
cout<<b<<a;
}
cout<<"4";
}
cout<<endl;
}
void even(){
for(int k=n-1;k>=1;k-=2){
int a=4,b=2;
cout<<"3";
for(int t=1;t<=5;t++){
if(t==5&&k==1) break;
cout<<a;
for(int i=1;i<=k-1;i++){
cout<<b<<a;
}
a++,b++;
if(a>6) a=1;
if(b>6) b=1;
}
if(k!=1){
cout<<a;
for(int i=1;i<=k-2;i++) cout<<b<<a;
}
if(k==1) cout<<"3";
else cout<<"4";
}
cout<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
if(n&1) odd();
else even();
}
return 0;
}
京公网安备 11010502036488号