1296A - Array with Odd Sum
题意:可以改变数组中的一个数的值成另外一个数组中的数,问能不能使数组的和是个奇数
思路:签到,如果本来数组的和就是个奇数,那就OK
如果不是,就需要把数组中其中一个奇(偶)数改成偶(奇)数,相当于加一减一
所以测一下这个数组如果有个奇数并且还有个偶数就行
#include <cstdio> #include <iostream> #include <map> #include <set> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int num[5000]; int main () { int t,n,flag=0; scanf("%d",&t); while (t--) { int all=0; int a1=0,a2=0; scanf("%d",&n); for (int i=0;i<n;i++) { scanf("%d",&num[i]); all=all+num[i]; if (num[i]%2==1) a1=1; if (num[i]%2==0) a2=1; } if (all%2==1) printf("YES\n"); else { if (a1&&a2) printf("YES\n"); else printf("NO\n"); } } return 0; }View Code
1296B - Food Buying
题意:你有一些钱,每花10块可以反1块,最多能花多少?
思路:相当于9块值10块了,但如果直接输出/9*10就WA
因为只有9块的情况下是不能返钱的,记一下就行
#include <cstdio> #include <iostream> #include <map> #include <set> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int main () { int t,n; scanf("%d",&t); while (t--) { scanf("%d",&n); long long all=(n/9)*10; if (n%9==0) printf("%d\n",all+n%9-1); else printf("%d\n",all+n%9); } return 0; }View Code
1296C - Yet Another Walking Robot
题意:有一个机器人,有一个字符串,机器人按照字符串里的字母移动
问能不能去掉一个最小的连续区间,使得机器人最终到达的目的地相同?
思路:我这个是真的没想出来,看题解之后才发现,只要有两次到了相同的地方,那么机器人在中间走的一段路就是多余的
再用一个map来储存经过的点,可以用map来检测是否经过同一个点,这样就行了
但是自己写的时候总是各种玄学问题,自定义的结构体放map里无法编译...改成pair之后cf又出个WA...最后改的和题解差不多才过...
#include <bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while (t--) { int n; char s; cin>>n; int l=-1,r=n; map<pair<int, int>,int> mm; pair<int, int> cur={0, 0}; mm[cur]=0; for (int i=0;i<n;++i) { cin>>s; if (s=='L') --cur.first; if (s=='R') ++cur.first; if (s=='U') ++cur.second; if (s=='D') --cur.second; if (mm.count(cur)) { if (i-mm[cur]+1<r-l+1) { l=mm[cur]; r=i; } } mm[cur]=i+1; } if (l==-1) cout<<-1<<endl; else cout<<l+1<<" "<<r+1<<endl; } return 0; }View Code
1296D - Fight with Monsters
题意:你和你的对手去打怪,按着顺序从小怪1一直到小怪n
这样打怪:你先打一下,你对手再打一下,如果在你打的时候怪死了,你得一分,你对手打的时候怪死了不得分,但是你还有几次机会可以让你的对手这次不出招,问你最多能得多少分?
思路 :好不容易除了签到又做了一道简单题...
首先,先计算在最后一轮中(也就是你和你对手都打一下这怪就死了的那一次)小怪的血量。
假如说你这次攻击能直接把怪打死,那ok,设这个怪的.ci=-1
如果不能,还是要你先打一次,然后算要让对手不出招多少次才能打死这只小怪,记到ci里
最后对所有小怪按击倒所需次数排序,遍历一遍就Ok
#include <bits/stdc++.h> using namespace std; struct mons { int ci; int hp; }; bool cmp (mons a,mons b) { return a.ci<b.ci; } mons mon[300000]; int main () { int n,a,b,k,tem,fin=0,i; scanf("%d %d %d %d",&n,&a,&b,&k); int all=a+b; for (i=0;i<n;i++) { scanf("%d",&tem); mon[i].hp=tem%all; if (mon[i].hp==0) mon[i].hp=all; if (mon[i].hp<=a) mon[i].ci=-1; else { mon[i].hp=mon[i].hp-a; if (mon[i].hp%a==0) mon[i].ci=mon[i].hp/a; else mon[i].ci=mon[i].hp/a+1; } } sort(mon,mon+n,cmp); for (int i=0;i<n;i++) { if (mon[i].ci==-1) fin++; else { if (k-mon[i].ci>=0) { k=k-mon[i].ci; fin++; } } } printf("%d\n",fin); return 0; }View Code