A1117
/*
题意:
1.有e天的骑行距离都是大于e的,所求的e表示天数
2.e必须是最大的
注意事项:
1.不是从所给的数组中进行寻找,而可以说是从1--n都可以寻找,只要满足e个数大于e即可
解题思路:
倒数第e个数是否大于e
*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=103333;
int s[maxn];
int n;
int main()
{
cin >> n;
int temp;
for(int i=0; i<n; i++)
{
cin >> s[i];
}
sort(s,s+n); //从小到大排列
for(int i=n; i; i--) //i表示天数,一共有n天,且要求e是最大的,所以从n开始向前遍历
{
if(s[n-i]>i) //s[n-i]表示只是所有比i大的数中最小的,i表示现在计算有i个数
{
cout << i;
return 0;
}
}
cout << 0; //如果没有找到就输出0,因为输出的都是正整数
return 0;
}
A1148
/*
解题思路:
1.逻辑推理题,就是通过枚举去验证是否正确
2.条件1:只有俩个狼人+只有1个狼人说谎
3.条件2:一共只有两个人说谎
*/
#include<iostream>
using namespace std;
const int maxn=101;
int a[maxn];
int n;
int judge(int k,int i,int j) //说谎返回1,否则返回0
{
int t=a[k];
if(t>0) //此时t表示人
{
if(i==t || j==t) //如果i为人或者j为人,则表示说谎
return 1;
return 0;
}
t=-t; //此时t表示狼人,但是编号为正,所以去相反数
if(i==t || j==t)
return 0;
return 1;
}
int main()
{
cin >> n;
for(int i=1; i<=n; i++)
cin >> a[i];
//下面的双层for是去判断是否为狼人,i,j表示为狼人
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++)
{
int s=0;
s=judge(i,i,j)+judge(j,i,j); //judge函数是判断第i个人是否说谎,说谎返回1,否则返回0
if(s!=1) //先判断两个狼人中说谎人的个数,如果不为1,则continue
continue;
int s1=0;
for(int k=1; k<=n; k++)
{
s1+=judge(k,i,j);
}
if(s1!=2)
continue;
//如果代码能走到这一步,则表示找到了合适的狼人,由于题目要求输出狼人按照字典序的升序排列,同时上面代码也是从1--n遍历,所以也就是直接输出,然后退出循环
cout << i << " " << j;
return 0;
}
cout << "No Solution";
return 0;
}