一,题目报告
赛中得185分,赛后AK。
二,赛中报告
T1,三角形分割
是一道签到题。
T2,魔法塔
是一道贪心题。
T3,数字加倍
是一道宽搜题
T4,不合法字符串
一道枚举题
三,题目解析
T1:
题目大意
小可是一名年轻有为的建筑师,他在一次勘测任务中遇到了一个有趣的问题。他来到了一个二维平面上的一个面积不为零的三角形,三角形的三个顶点分别是A、B、C。 小可想要判断是否能够在这个三角形上画一条水平或竖直的线,将这个三角形划分为两个面积不为零的三角形。 但是小可不太会写代码,请你帮助小可,使用代码实现这个功能。
输入描述
第一行:输入一个正整数 t ,表示多组测试样例的数量。
对于每组测试样例,在单独的一行中输入6个整数,x1,y1,x2,y2,x3,y3,(xi,yi)表示三个点的坐标。
输出描述
对于每组测试样例,如果能用一条水平或竖直的线,将这个三角形划分为两个面积不为零的三角形,则输出YES
,否则输出NO
。
题目解析
很容易看出来,只要三角形不是直角三角形就输出YES
AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
while(n--){
int a,b,c,d,e,f;
scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
if((a!=c&&a!=e&&c!=e)||(b!=d&&b!=f&&d!=f))printf("YES\n");
else printf("NO\n");
}
return 0;
}
T2:
题目大意
他必须通过一系列的挑战来提升自己的魔法能力。
挑战的规则是这样的:在每一次挑战中,小可可以选择两个魔法石,其中一个魔法石的能量值比另一个魔法石高。然后,他可以将能量值高的魔法石的能量减少1,并将能量值低的魔法石的能量增加1。小可可以进行任意多次的挑战操作。注意,魔法石的顺序不可以改变,且能量不能小于0。
小可非常聪明,他意识到,通过巧妙地选择挑战操作,他可以使得某个魔法石的能量值变得非常高。他想知道,在经过任意多次的挑战操作后,能够使得第一个魔法石的能量值最高,请问这个最高的能量值是多少。
输入描述
第1行:输入一个正整数 t ,表示多组测试样例的组数。
对于每组测试样例:
第1行:输入一个正整数 n ,表示有 n 个魔法石。
第2行:输入 n 个正整数,表示魔法石的初始能量值 a[i]。
输出描述
对于每组测试样例,输出经过任意次操作后,第一个魔法石能达到的最高能量值。
题目解析
让a[0]最大,要让a[0]与其他魔法石平均,要排序。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
long long n,a[10001];
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
for(int i=1;i<n;i++){
if(a[i]>a[0])a[0]+=(a[i]-a[0]+1)/2;
}
printf("%lld\n",a[0]);
}
return 0;
}
T3:
题目大意
小可是一个数学天才,他喜欢研究数学问题。有一天,他遇到了一个有趣的问题。
问题是这样的:给定两个正整数n和x,小可需要对x进行一系列操作,使得x的位数与n相等,并且操作次数最少。每次操作,小可需要从x的十进制表示中截取一位数字y,然后将y与x相乘得到x’。例如,如果x=123,而小可截取的数字是2,则x’ = 123 * 2 = 246,之后令 x = x’ 。
输入描述
输入两个数字n 和 x ,表述如题
输出描述
输出操作次数的最小值,如果不可能,则输出-1
题目解析
AC代码
#include <bits/stdc++.h>
#include <set>
#define infll 0x3f3f3f3f3f3f3f3f
#define ll long long
#define F first
#define S second
using namespace std;
ll n,k,ans=infll;
queue<pair<ll,ll>> q;
map<ll,ll> m;
set<int> s,nu;
int get(ll x){
int len=0;
while(x){
x/=10;
len++;
}
return len;
}
void bfs(){
q.push({k,0});
m[k]=1;
while(!q.empty()){
ll u=q.front().F;
ll step=q.front().S;
q.pop();
int len=get(u);
if (len==n){
ans=step;
return;
}
if (len>n)continue;
ll x=u;
s=nu;
while (x){
s.insert(x%10);
x/=10;
}
for (auto i : s){
if (m[u*i] == 0){
m[u*i] = 1;
q.push({u*i,step+1});
}
}
}
}
int main(){
cin >> n >> k;
bfs();
if (ans == infll)ans = -1;
cout << ans << endl;
return 0;
}
T4:
题目大意
小可是一名小说审核员,他的工作是看小说,然后把小说中不合法字符串和谐掉。
现在给出若干个不合法的字符串 s[i],和一篇小说 str ,小可需要把 str 中的不合法字符串用 *
和谐掉。当然小可是一个很聪明的审核员,他会用最少的 *
和谐字符串。
比如:
有三个不合法字符串:abc
、ab
、a
。str=abcd
他会只和谐a
,使得str=*bcd
,这样小说中就没了不合法字符串。
请输出和谐之后的小说。
输入描述
第一行:输入一个整数 T 表示测试用例数。
对于每组测试样例:
第一行:输入一个正整数 n ,表示不合法字符串的数量。
接下来n行:每行输入一个字符串,表示不合法字符串。
接下来一行:输入一个字符串,表示小说。
输出描述
输出和谐之后的小说
题目解析
AC代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int t;
scanf("%d",&t);
while(t--){
ll n;
scanf("%lld",&n);
vector<string> v(n);
for(auto &i:v){
cin>>i;
}
string s;
cin>>s;
n=s.size();
s=" "+s+" ";
for(int i=1;i<=n;i++){
for(auto &j : v){
if(i-int(j.size())<0){
continue;
}
if(s.substr(i-j.size()+1,j.size())==j){
s[i]='*';
}
}
}
cout<<s.substr(1,n)<<'\n';
}
return 0;
}
四,总结
下次比赛把能得的分都得了。