import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { // 输入: Scanner in = new Scanner(System.in); int N = in.nextInt(); int M = in.nextInt(); int[] list = new int[M]; int[] mark = new int[M]; ArrayList<Integer> taskList = new ArrayList<Integer>(); ArrayList<Integer> tempTask = new ArrayList<Integer>(); int count = 0; while (in.hasNextInt()) { taskList.add(in.nextInt()); count++; if (count == N) { break; } } count = 0; while (in.hasNextInt()) { tempTask.add(in.nextInt()); count++; if (count == M) { break; } } in.close(); if(taskList.get(0) != 1){ for(int i = 0;i< M;i++) if(tempTask.get(i) == 1){ list[i] = 1; mark[i] = -1; } } else{ for(int i = 1; i < N; i++){ if(taskList.get(i) - taskList.get(i - 1) >= 2){ for(int j = 0;j< M;j++){ if(mark[j] == -1) continue; if(tempTask.get(j) <= taskList.get(i - 1) + 1){ list[j] = taskList.get(i - 1) + 1; mark[j] = -1; } if(tempTask.get(j) > taskList.get(i - 1) + 1 && tempTask.get(j) < taskList.get(i)){ list[j] = tempTask.get(j); mark[j] = -1; } } } } } for(int i = 0;i< M;i++){ if(mark[i] == -1) continue; if(tempTask.get(i) <= taskList.get(N-1) + 1){ list[i] = taskList.get(N-1)+1; mark[i] = -1; } if(tempTask.get(i) > taskList.get(N-1) + 1 ){ list[i] = tempTask.get(i); mark[i] = -1; } } for(int i = 0;i < M;i++) System.out.println(list[i]); } }
第三题贴个Java版本的吧,比较粗糙,可惜输出代码多了一个“ok”
问题3:java版
import java.util.ArrayList; import java.util.Scanner; public class Main { public void fingEmpty(int[] array, int[] tmpArray) { ArrayList<Integer> list = new ArrayList<>(); //保存可以使用的值 for (int i = 1; i < array[0]; i ++) { list.add(i); } ArrayList<Integer> numberInArray = new ArrayList<>(); for (int val : array) { numberInArray.add(val); } for (int i = array[0]; i < array[array.length - 1]; i ++) { if (!numberInArray.contains(i)) { list.add(i); } } list.add(array[array.length - 1] + 1); ArrayList<Integer> result = new ArrayList<>(); for (int j = 0; j < tmpArray.length; j ++) { for (int i = 0; i < list.size(); i ++) { if (tmpArray[j] <= list.get(i)) { result.add(list.get(i)); break; } } } for (int val : result) { System.out.println(val); } } public static void main(String[] args) { Main main = new Main(); // int[] array = new int[] {1,2,3,5,6}; // int[] tmpArray = new int[]{3,2,1,4,5,6}; // main.fingEmpty(array, tmpArray); Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int N = sc.nextInt(); int M = sc.nextInt(); int[] array = new int[N]; int[] tmpArray = new int[M]; for (int i = 0; i < N; i ++) { array[i] = sc.nextInt(); } for (int i =0; i < M; i ++) { tmpArray[i] = sc.nextInt(); } main.fingEmpty(array, tmpArray); } } }
import java.util.Scanner; public class Main { static int t[]; static int q[]; static int q_time[]; static int n; static int m; public static void main(String[] args) { Scanner scan = new Scanner(System.in); n = scan.nextInt(); m = scan.nextInt(); t = new int[n]; q = new int[m]; q_time = new int[m]; int i = 0; while(i < n){ t[i] = scan.nextInt(); i++; } i = 0; while(i < m){ q[i] = scan.nextInt(); i++; } int t_min = t[0]; search(t_min); for(i=1; i<n; i++){ search(t[i]); } for(i=0; i<m; i++){ if(q[i] != 0){ q_time[i] = q[i]; } } for(i=0; i<m; i++){ System.out.println(q_time[i]); } } public static void search(int t){ for(int i=0; i<m; i++){ if(q[i] < t && q[i] != 0){ q_time[i] = q[i]; q[i] = 0; }else if(q[i] == t){ q[i] = q[i] + 1; } } } }
第三题,我是这样写的,自己测数据能过,为什么给wrong?
var timeArray = [];
var lineCount = 1;
var taskList = [];
var taskLS = [];
var freeTime = [];
while(line = read_line()){
line = line.trim();
if (lineCount ==2) {
taskList = line.split(' ');
}
if (lineCount > 2) {
taskLS.push(parseInt(line));
}
lineCount++;
}
var listlength = taskList.length
for(var i = 0; i<listlength;i++){
taskList[i] = parseInt(taskList[i]);
}
for(var j = taskList.length - 1; j > 0; j++){
var gap = taskList[j] - taskList[j-1];
if (gap > 1) {
var current = taskList[j]-1;
while(current>taskList[j-1]){
freeTime.push(current);
current--;
}
}
}
freeTime = freeTime.reverse();
var lslength = taskLS.length;
for(var z=0; z < lslength; z++){
sss:
for(var k =0; k<freeTime.length; k++){
if (taskLS[z]<=freeTime[k]) {
timeArray[z] = freeTime[k];
break sss;
}
else timeArray[z] = taskList[taskList.length-1];
}
}
var timeLength = timeArray.length;
for(var y = 0;y<timeLength; y++){
print(timeArray[y]);
}
int main() { int n = 0; int m = 0; cin >> n; cin >> m; if (m == 0) return 0; int* temp_task = new int[m]; int* task = new int[n]; int* res = new int[m]; memset(res, 0, m * sizeof(int)); for (int i = 0; i < n; ++i) { cin >> task[i]; } for (int i = 0; i < m; ++i) { cin >> temp_task[i]; } for (int i = 1, j = 0; i <= task[n-1] + 1; ++i) { if (i == task[j]) { //非空闲 ++j; continue; }//空闲时间 for (int k = 0; k < m; ++k) { if (res[k] == 0 && temp_task[k] <= i) { res[k] = i; } } } for (int i = 0; i < m; ++i) { cout << res[i] << endl; } return 0; }
var T = 'abbb'; function search(str,low){ var high=[]; var len = str.length; var obj={}; var x = false; for(var i=low;i<len;i++){ x = true; if(!obj.hasOwnProperty(str[i])){ obj[str[i]]=1; }else{ obj[str[i]]=0; } for(var key in obj){ if(obj[key]==1) x=false; } if(x==true){ high.push(i); } } return high; } var low=0; var high=0; var len = T.length; var result = 0; while(low<len){ low = low+1; var high = search(T,low); result+=high.length; } console.log(result)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int birany_search(vector<int>&container, int target)
{
for(int i = 0; i < container.size(); ++i)
{
if (target <= container[i])
{
return (i >= 1 ? i - 1 : -1);
}
}
return container.size() - 1;
//int left = 0;
//bool find_that = false;
//int right = container.size();
//int mid = (left + right) / 2;
//while (left < right)
//{
// if (target > container[mid])
// {
// right = mid - 1;
// }
// else if (target < container[mid])
// {
// left = mid + 1;
// }
// else
// {
// find_that = true;
// break;
// }
//}
//if (find_that)
//{
// for(int i = mid; i >= 0; --i)
// {
// if (container[i] != target)
// {
// left = i;
// }
// }
//}
//return left;
}
int main()
{
int n, m;
cin >> n >> m;
vector<int>plan(n);
for(int i = 0; i < n; ++i)
{
int mission;
cin >> mission;
plan[i] = mission;
}
vector<int>temp_list(m);
for(int i = 0; i < m; ++i)
{
int mission;
cin >> mission;
temp_list[i] = mission;
}
sort(plan.begin(), plan.end());
sort(temp_list.begin(), temp_list.end());
int i;
for(i = 1; i < plan.size(); ++i)
{
if (plan[i] != plan[i - 1] + 1)
{
int index = birany_search(temp_list, plan[i]);
if (index >= 0)
{
for (int j = 0; j <= index; ++j)
{
if (temp_list[j] <= plan[i - 1] + 1)
{
cout << plan[i - 1] + 1 << endl;
}
else
{
cout << temp_list[j] << endl;
}
}
temp_list.erase(temp_list.begin(), temp_list.begin() + index + 1);
}
}
}
if (!temp_list.empty())
{
for(int j = 0; j < temp_list.size(); ++j)
{
cout << plan[i - 1] + 1 << endl;
}
}
// system("pause");
return 0;
}
二分搜索出bug来不及调,最后都不知道自己是否AC
#include <iostream> #include<stdio.h> using namespace std; int main() { int i; int count; int x,p; double array1[100],array2[100],array3[100]; double sum=0; scanf("%d",&count); for(i=0;i<count;i++) { cin>>x; cin>>p; array1[i]=x; array2[i]=p; array3[i]=array2[i]/100; sum=sum+array1[i]*array3[i]; } printf("%.3lf\n",sum); return 0; }
//不知道有没有ac,在本地通过了样例数据,也是查找的思想,只是用容器vector的find代替了。另外,有同学把第二题的分析思路分享一下吗,不是很懂。
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
int main(){
int n,m,a,b;
vector<int> data;
vector<int> res;
cin>>n>>m;
cin.ignore();
string line;
getline(cin,line);
istringstream iss(line);
while(iss>>a)
{
data.push_back(a);
iss.clear();
}
vector<int>::iterator it=data.begin();
while(cin>>b)
{
it=find(data.begin(),data.end(),b);
if(it==data.end())
{
res.push_back(b);
}else{
while(*it++==b++){}
b--;
res.push_back(b);
}
}
for(auto r:res){
cout<<r<<endl;
}
}
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int maxn=1<<26; bool vs[30]; long long int total[maxn]; int get_status() { int now=0,d=1; for(int i=0;i<26;i++) { if(vs[i]) now+=1*d; d<<=1; } return now; } inline long long int C(long long int num) { return num*(num-1)/2; } int main(void) { ios::sync_with_stdio(false); long long int ans=0; int status; string str; cin >> str; for(int i=0;i<str.size();i++) { vs[str[i]-'a']=(vs[str[i]-'a']^1); status=get_status(); total[status]++; } for(int i=0;i<maxn;i++) ans+=C(total[i]); cout << ans+total[0] << endl; return 0; }
第三题Java版 已AC:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int[] taskn = new int[n];
int[] taskm = new int[m];
for (int i = 0; i < n; i++) {
taskn[i] = scanner.nextInt();
}
for (int i = 0; i < m; i++) {
taskm[i] = scanner.nextInt();
}
Arrays.sort(taskn);// 升序排序
int index = 0;
int tt[] = new int[taskn[n - 1] * 2];
boolean flag = false;
for (int i = 1; i <= taskn[n - 1] + 1; i++) {
flag = false;
for (int j = 0; j < n; j++) {
if (taskn[j] == i) {
flag = true;
break;
}
if (taskn[j] > i) {
break;
}
}
if (!flag) {
tt[index] = i;
index++;
}
}
for (int i = 0; i < m; i++) {// 可以执行临时任务的时间列表
int k = 0;
if (taskm[i] <= tt[k]) {
taskm[i] = tt[k++];
} else {
index = k;
while (taskm[i] > tt[index]&&index<=tt.length) {
index++;
}
taskm[i] = tt[index];
}
}
for (int t : taskm) {
System.out.println(t);
}
scanner.close();
}
}
我来解释一下第二题好了,,,扫一遍记录下每个前缀子串的状态(每个字母出现的次数为奇/偶)。如果两个前缀状态相同,说明夹在它们中间的子串肯定是个偶串。我是组合数算的,相同状态的前缀两两组合都是一个偶串,像题解里每次相加也行。
因为只有26个字母,所以可以状态压缩,用 32 位 int 的其中 26 位来记录状态,某位为 0 表示 该位对应的字母为偶数。
1<<26的状态数太大了所以用map存。注意有个坑是mp[0] = 1,不然20%会挂掉。
#include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <iostream> using namespace std; map<int, int> mp; long long solve() { char s[100005]; scanf("%s", s); int st = 0; mp[0] = 1; for(int i = 0; s[i]; i++) { st ^= 1 << (s[i] - 'a'); if(mp.count(st)) mp[st]++; else mp[st] = 1; } map<int, int>::iterator it; long long ans = 0; for(it = mp.begin(); it != mp.end(); it++) { int sc = it -> second; //cout << fr << ' ' << sc << endl; if(sc > 1) ans += 1LL * (sc - 1) * sc / 2; } return ans; } int main() { //freopen("in.txt", "r", stdin); printf("%lld\n", solve()); return 0; }
问题3,java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n,m; n=scanner.nextInt(); m=scanner.nextInt(); int t[]=new int[n]; int q[]=new int[m]; int now1=0,now2=0; for (int i = 0; i < t.length; i++) { t[i]=scanner.nextInt(); } for (int i = 0; i < q.length; i++) { q[i]=scanner.nextInt(); } scanner.close(); int result[]=new int[m]; boolean flag; for (int i = 0; i < q.length; i++) { flag=true; for (int j = 0; j < t.length; j++) { if (t[j]==q[i]) { flag = false; q[i]++; j=0; } if (t[j]!=q[i]&&j==t.length-1) { flag=true; } } if (flag) { result[i] = q[i]; }else{ result[i] = t[n-1]+1; } } for (int i = 0; i < result.length; i++) { System.out.println(result[i]); } } }
第二题偶串,Javascript,本地运行没问题。。。有人要帮忙看看么
var str = read_line(); var count = 0; var sLength = str.length; function isO(strSon){ var d = []; for(var n = 0;n<=i ;n++){ var a = strSon.slice(n,n+1); if(d.includes(a)){ var c = d.indexOf(a); d.splice(c,1); }else{ d.push(a); } } if(d.length == 0){ count++; } } for(var i = 1;i < sLength;i++){ for(var j = 0;j < sLength-i;j++){ var strSon = str.slice(j,j+(i+1)); isO(strSon); } } print(count);