抽奖
题目描述:公司举办年会,为了活跃气氛,设置了摇奖环节。参加聚会的每位员工都有一张带有号码的抽奖券。现在,主持人依次公布 n 个不同的获奖号码,小谢看着自己抽奖券上的号码 num,无比紧张。请编写一个程序,如果小谢获奖了,请输出他中的是第几个号码;如果没有中奖,请输出 0。 输入格式:第一行一个正整数 n,表示有 n 个获奖号码,2<n≤100。第二行包含 n 个正整数,之间用一个空格隔开,表示依次公布的 n 个获奖号码。第三行一个正整数 num,表示小谢抽奖券上的号码。1≤获奖号码,num<10000。 输出格式:一行一个整数,如果小谢中奖了,表示中奖的是第几个号码;如果没有中奖,则为 0。
Sample Input
7
17 2 3 4 9555 6 1
3
Sample Output
3
遍历查询即可
#include<bits/stdc++.h>
using namespace std;
int main(){
int n = 0, target = 0; cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; ++i) cin >> nums[i];
cin >> target;
for(int i = 0; i < n; ++i) {
if(nums[i] == target) {
cout << i + 1 << endl;
return 0;
}
}
cout << 0 << endl;
}
比身高
有 N 个人排成一排,假设他们的身高均为正整数,请找出其中符合以下条件的人:排在他前面且比他高的人数与排在他后面且比他高的人数相等。Input第一行为一个正整数 N,1<N<1000,表示有多少个人。下面 N 行,每行一个正整数,表示从前往后每个人的身高,假设每个人的身高≤10000。Output一行一个整数,表示满足这个条件的人数。
Sample Input
4
1
2
1
3
Sample Output
2
枚举得出每个人前面和后面比他高的人数,看是否相等
#include<bits/stdc++.h>
using namespace std;
int main(){
int n = 0, l = 0, r = 0, ans = 0; cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; ++i) cin >> nums[i];
for(int i = 0; i < n; ++i) {
for(int j = i - 1; j >= 0; --j) {
if(nums[j] > nums[i]) ++l;
}
for(int j = i + 1; j < n; ++j) {
if(nums[j] > nums[i]) ++r;
}
if(l == r) ++ans;
l = 0, r = 0;
}
cout << ans << endl;
}
楼层编号
小林在 NOIP 比赛期间住在“新世界”酒店。和其他酒店不一样的是,这个酒店每天都有一个高能的数字 t,这个数字在楼层中是不会出现的,以 t=3 为例,则 3、13、31、33 等楼层是不存在的,楼层编号为 1,2,4,5,…所以实际上的 4 楼才是 3 楼。已知小林预订了编号为 m 层的房间,并且当天高能数字是 t,现在他想知道房间所在的真实楼层是多少。Input一行两个整数 m 和 t,1≤m≤100000,0≤t≤9,保证 m 对 t 合法。Output一行一个整数,表示真实楼层。
Sample Input
14 3
Sample Output
12
遍历从一层到m层的所有层数,若该楼层实际上不存在就将编号对应的楼层减一。
#include<bits/stdc++.h>
using namespace std;
int is(int t, int num) {
while(num > 0) {
if(num % 10 == t)
return 1;
num /= 10;
}
}
int main(){
int m = 0, t = 0, n = 0; cin >> m >> t;
int ans = m;
for(int i = 1; i <= m; ++i) {
ans -= is(t,i);
}
cout << ans << endl;
}
奶牛碑文
Description 小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文。碑文似乎是一个神秘古老的语言,只包括三个大写字母 C、O 和 W。尽管小伟看不懂,但是令他高兴的是,C、O、W的顺序形式构成了一句他最喜欢的奶牛单词“COW”。现在,他想知道有多少次 COW 出现在文本中。如果 COW 内穿插了其他字符,只要 COW 字符出现在正确的顺序,小伟也不介意。甚至,他也不介意出现不同的 COW 共享一些字母。例如,CWOW 出现了 1 次 COW,CCOW 算出现了2 次 COW,CCOOWW 算出现了 8 次 COW。Input第 1 行为 1 个整数 N。第 2 行为 N 个字符的字符串,每个字符是一个 C、O 或 W。Output输出 COW 作为输入字符串的子串出现的次数(不一定是连续的)。提示:答案会很大,建议用 64 位整数(long long)。
Sample Input
6
COOWWW
Sample Output
6
Hint
对于 50% 的数据满足:N≤60。对于 100% 的数据满足:N≤100000。
单组输入
总个数等于每个O
左边C
的个数乘右边W
的个数之和
#include<bits/stdc++.h>
using namespace std;
int main(){
int n = 0, l = 0, r = 0, flag = 1, ans = 0; cin >> n;
vector<char> ch(n);
for(int i = 0; i < n; ++i) cin >> ch[i];
for(int i = 0; i < n; ++i) {
if(ch[i] == 'O') {
if(flag) {
for(int j = 0; j < i; ++j) if(ch[j] == 'C') ++l;
for(int j = i + 1; j < n; ++j) if(ch[j] == 'W') ++r;
flag = 0;
}
ans += l * r;
}
if(ch[i] == 'C') ++l;
if(ch[i] == 'W') --r;
}
cout << ans << endl;
}
和为K
给出长度为n的数组,求能否从中选出若干个,使他们的和为K.如果可以,输出:Yes,否则输出No
Input输入数据为多组,每组两行。
第一行:输入N,K,为数组的长度和需要判断的和(2<=N<=20,1<=K<=10^9)
第二行:N个值,表示数组中元素的值(1<=a[i]<=10^6)Output输出Yes或No,每组数据的输出占一行。
Sample Input
5 13
2 4 6 8 10
Sample Output
No
可以使用二进制枚举,但是我使用了回溯法进行暴力枚举
#include<bits/stdc++.h>
using namespace std;
int ans = 0;
vector<int> temp;
void backtracking(int start, vector<int> nums, int k, int target) {
if(target < 0) return;
if(temp.size() == k) {
if(target == 0) ++ans;
return;
}
for(int i = start; i <= (nums.size() - k + temp.size()); ++i) {
temp.push_back(nums[i]);
backtracking(i + 1, nums, k, target - nums[i]);
temp.pop_back();
}
}
int main(){
int n = 0, target = 0;
while(cin >> n >> target) {
vector<int> nums(n);
for(int i = 0; i < n; ++i) cin >> nums[i];
for(int k = 1; k <= n; ++k) {
backtracking(0, nums, k, target);
if(ans) break;
}
ans == 0 ? cout << "No" << endl : cout << "Yes" << endl;
ans = 0;
}
}