UPC 2020年夏混合个人训练第七十八场

问题 D: 数学难题 difficult

题目描述
作为签到题,当然要有一个生动的背景了。
Kangkang 最近学习了英语,老师教会了他如何背诵 34 个政区名称,甚至学习了化学,了解到怎么才能成功的变法(他不敢),但他最不感兴趣的还是数学,今天老师教会了他怎么判断一个数是单数还是双数。今天叶老师给他布置的家庭作业是一个很长的表格,似乎是财务报表,单双数的多少决定了他今天的心情,Kangkang 务必完成。可是因为 Kangkang 太爱打球了,都忘了怎么判断,听说你会编程,就来找你帮他完成作业。 (difficult)

输入
第一行,一个正整数 n。
接下来 n 行,每行有一个正整数 Ai(i=1,2,3,…,n)。
输出
一共 n 行,如果 Ai 是偶数输出 even,否则输出 odd。

样例输入
5
12
9
234
1578
254632
样例输出
even
odd
even
even
even

提示
对于所有数据,n≤1000,Ai≤10^82。

思路:其实看到1e82,就要想到只能用字符串去解决了,根据string最后保存的个位数判断奇偶(还是自己意识薄弱,非要爆一次 ll 才能看清QAQ)。

#include<bits/stdc++.h>
#define ll long long  
using namespace std;
int main()
{
    
    
	int n;
    cin>>n;
    while(n--)
	{
    
    
        string ss;
        cin>>ss;
        int n=ss.size();
        if((ss[n-1]-'0') % 2 == 1)  printf("odd\n");
        else  printf("even\n");
    }
    return 0;
}

问题 E: 阅兵队形 plane

题目描述
70 周年阅兵的时候,飞机在空中排练着队形,Yyx 很好奇,他想知道这么训练有素的队形到底是如何造就的呢?他记录下了飞行路径上的各个端点。
他发现:把整个天空看做一个平面直角坐标系,飞行路径是所有过任意两个端点的直线。
如果这些飞机可能会撞在一起,或者说只要这些直线有交点,就可能发生事故。
在所有直线中应该最少删除多少条直线使得剩下的直线两两都不相互平行(重合也是平行)。
求出最多可以构成多少条两两互不平行的直线。

输入
第一行,整数 n。
接下来 n 行,每行两个整数 x,y,表示这个端点的横坐标与纵坐标。
输出
一行,一个整数 ans,表示答案。

样例输入
4
-1 1
-2 0
0 0
1 1
样例输出
4

提示
对于所有数据,2≤N≤200,-1000≤Xi≤1000,-1000≤Yi≤1000。
在所有直线中应该最少删除多少条直线使得剩下的直线两两都不相互平行。

这题的话不止一种解法,专门拿出来另写了一篇 blog,点击此处进入~

问题 F: 摆花的人 flower

题目描述
在曾经的讲解中,花和他的兄弟姐妹们被这个叫做 Yyx 的人摆来摆去,吓得耳朵都瞎了,嘴巴也听不见了。于是他们决定「以其人之道还治其人之身」,他们把 Yyx, Kangkang, Michael 等人摆成一排,这个时候,花说道:「你们的身高太不和谐了,只有满足我的要求的人才能留下,其他人都去当花。」而 Yyx 想留下尽量多的同胞们,于是他来找你了。
具体而言,人的高度可以看成一列整数h1,h2,…,hn。
设当一部分人出去后,剩下的人的高度依次为g1,g2,…,gm ,则花们希望下面两个条件中至少有一个满足:
·条件A :对于所有 g2i>g2i-1,g2i>g2i+1。
·条件B :对于所有 g2i<g2i-1,g2i<g2i+1。。
注意上面两个条件在 n=1 时同时满足,当 n > 1 时最多有一个能满足。

输入
第一行包含一个正整数 n ,表示开始时的人数。
第二行包含 n 个正整数,依次为 h1,h2,…hn , 表示每个人的高度。
输出
输出留下的人数的最大值。

样例输入
5
5 3 2 1 2
样例输出
3

提示
对于所有数据,1≤n≤1e6,0≤hi≤1e6

思路:ans初值赋为1,一直下降突然上升ans++,一直上升突然下降ans++

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n,h[N],flag,ans;

int main() 
{
    
    
	scanf("%d",&n);
	for(int i=1; i<=n; i++)	 scanf("%d",&h[i]);
	
	if(h[2]>=h[1])	flag=1;
	
	for(int i=1; i<=n; i++) 
	{
    
    
		if(flag==0&&i==n) {
    
    
			ans++;
			break;
		}
		if(flag==1)
			if(h[i+1]<h[i]) {
    
    
				ans++;	flag=0;
				continue;
			}
		if(flag==0)
			if(h[i+1]>h[i]) {
    
    
				ans++;	flag=1;
				continue;
			}
	}
	
	ans++;
	printf("%d\n",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Luoxiaobaia/article/details/108017515
UPC