好像没办法交题以及不知道会不会开放提交(尴尬
这里大概就存下代码和思路了:
1001
没啥好说的
找规律打一下就可以了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int N=1e3+10;
char s[N];
int main(){
int t;
scanf("%d",&t);
getchar();
while(t--){
gets(s);
if(s[14]=='?'){
puts("-_-");
}
else if(s[14]=='.'){
puts("Orz");
}
else{
int cnt=0;
for(int i=14;s[i];i++) cnt++;
printf("W");
while(cnt--) printf("o");
puts("w!");
}
}
}
1002
数位dp:
dfs:
不知道写的对不对,反正就瞎搜一下:
从0~原数首位-1,不断搜不减位直到最后一位就ans++;
然后从原数首位开始搜,如果当前位与原数该位的数字相同,就打上标记;
搜的时候看上一位是否有标记,如果没有标记就直接往下搜;如果有标记就必须当前位的数比原数当前位小or等于才能继续搜;
直到最后一位也满足条件ans++;
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
char s[10];
int a[10];
int vis[10];
int ans,cnt;
void dfs1(int x,int d){
if(vis[d-1]&&x>a[d]) return;
if(d==cnt){
ans++;
return ;
}
if(x==a[d]) vis[d]=1;
for(int i=0;i<10;i++){
if(i>=x){
dfs1(i,d+1);
}
}
}
void dfs(int x,int d){
if(d==cnt){
ans++;
return;
}
for(int i=0;i<10;i++){
if(i>=x){
dfs(i,d+1);
}
}
}
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%s",&s);
ans=0;
for(cnt=0;s[cnt];cnt++){
a[cnt+1]=s[cnt]-'0';
}
memset(vis,0,sizeof(vis));
dfs1(a[1],1);
for(int i=0;i<a[1];i++){
dfs(i,1);
}
ans--;
printf("%d\n",ans);
}
}
1003
贪心?(其实是瞎搞
先把需要清洗的衣服中10件10件的丢去清洗,然后考虑剩下来的情况
(剩下来就是(n-m)%10,0<(n-m)%10<10)
如果剩下来的全是待脱水的,直接全部3件一脱水,最后有多的再脱一次
如果剩下来的总和(待清洗+待脱水)>=10,那么就直接洗10件,然后剩下的脱水(因为待清洗的一定<10)
(这里要明确,洗衣服一定是多的洗划算)
总和>=6,直接洗6件,再脱水;
总和>=3,直接洗3件,再脱水;
总和<3,直接洗三件即可;
我的版本重复代码太多啦,不过完全是按照这样的思路去写的
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int main() {
int t;
scanf("%d",&t);
while(t--) {
int n,m;
scanf("%d %d",&n,&m);
int sum=0;
int rest=n-m;
sum+=rest/10*4;
rest%=10;
if(rest==0) {
sum+=m/3;
if(m%3) sum+=1;
} else if(rest+m>=10) {
sum+=4;
m-=(10-rest);
sum+=m/3;
if(m%3) sum+=1;
} else if(rest+m>=6) {
sum+=3;
m-=(6-rest);
sum+=m/3;
if(m%3) sum+=1;
} else if(rest+m>=3) {
sum+=2;
m-=(3-rest);
sum+=m/3;
if(m%3) sum+=1;
}else{
sum+=2;
}
printf("%d\n",sum);
}
}
1004
dfs:
记录一下每张卡片的数目
然后dfs考虑只要存在就每张卡片-1的情况,四个方向搜一下
不断让当前值和之前记录的ans取大者
最后比较一下m与ans
觉得自己想的没问题吼
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
char s[10];
int ans,now;
int f1,i1,d1,e1;
void dfs(int fc,int ic,int dc,int ec,int tot){
if(tot<0){
return;
}
else now=(6+(e1-ec)*2+d1-dc)*(f1-fc)+(3+(e1-ec)*2+d1-dc)*(i1-ic);
ans=max(ans,now);
if(tot==0) return;
if(fc>0) dfs(fc-1,ic,dc,ec,tot-4);
if(ic>0) dfs(fc,ic-1,dc,ec,tot-2);
if(dc>0) dfs(fc,ic,dc-1,ec,tot-2);
if(ec>0) dfs(fc,ic,dc,ec-1,tot-4);
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
int n,m;
scanf("%d %d",&n,&m);
ans=0;
int fc=0,ic=0,dc=0,ec=0;
for(int i=1; i<=n; i++) {
scanf("%s",s);
if(s[0]=='F') fc++;
else if(s[0]=='I') ic++;
else if(s[0]=='D') dc++;
else ec++;
}
f1=fc,i1=ic,d1=dc,e1=ec;
dfs(fc,ic,dc,ec,10);
if(ans>=m) puts("Yes");
else puts("No");
}
}
或者直接把情况列举出来……
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
char s[10];
int main() {
int t;
scanf("%d",&t);
while(t--) {
int n,m;
scanf("%d %d",&n,&m);
int fc=0,ic=0,dc=0,ec=0;
for(int i=1; i<=n; i++) {
scanf("%s",s);
if(s[0]=='F') fc++;
else if(s[0]=='I') ic++;
else if(s[0]=='D') dc++;
else ec++;
}
if(fc==0&&ic==0) puts("No");
else if(ic>=1&&m<=3) puts("Yes");
else if(ic>=2&&m<=6) puts("Yes");
else if(ic>=3&&m<=9) puts("Yes");
else if(ic>=4&&m<=12)puts("Yes");
else if(ic>=5&&m<=15)puts("Yes");
else if(fc>=1&&m<=6)puts("Yes");
else if(fc>=2&&m<=12)puts("Yes");
else if(ic>=1&&fc>=1&&m<=9)puts("Yes");
else if(ic>=1&&fc>=2&&m<=15)puts("Yes");
else if(ic>=2&&fc>=1&&m<=12)puts("Yes");
else if(ic>=3&&fc>=1&&m<=15)puts("Yes");
else if(fc>=1&&dc>=1&&m<=7)puts("Yes");
else if(fc>=1&&dc>=2&&m<=8)puts("Yes");
else if(fc>=1&&dc>=3&&m<=9)puts("Yes");
else if(fc>=2&&dc>=1&&m<=14)puts("Yes");
else if(ic>=1&&ec>=1&&m<=5)puts("Yes");
else if(ic>=1&&ec>=2&&m<=7)puts("Yes");
else if(ic>=2&&ec>=1&&m<=10)puts("Yes");
else if(ic>=3&&ec>=1&&m<=15)puts("Yes");
else if(fc>=1&&ec>=1&&m<=8)puts("Yes");
else if(ic>=1&&dc>=1&&ec>=1&&m<=6)puts("Yes");
else if(ic>=2&&dc>=1&&ec>=1&&m<=12)puts("Yes");
else if(ic>=1&&dc>=2&&ec>=1&&m<=7)puts("Yes");
else if(fc>=1&&dc>=1&&ec>=1&&m<=9)puts("Yes");
else if(fc>=1&&ic>=1&&ec>=1&&m<=13)puts("Yes");
else if(fc>=1&&ic>=1&&dc>=1&&m<=11)puts("Yes");
else if(fc>=1&&ic>=1&&dc>=2&&m<=13)puts("Yes");
else if(fc>=1&&ic>=2&&dc>=1&&m<=15)puts("Yes");
else if(ic>=1&&dc>=1&&m<=4) puts("Yes");
else if(ic>=1&&dc>=2&&m<=5) puts("Yes");
else if(ic>=1&&dc>=3&&m<=6) puts("Yes");
else if(ic>=1&&dc>=4&&m<=7) puts("Yes");
else if(ic>=2&&dc>=1&&m<=8) puts("Yes");
else if(ic>=2&&dc>=2&&m<=10) puts("Yes");
else if(ic>=2&&dc>=3&&m<=12) puts("Yes");
else if(ic>=3&&dc>=1&&m<=12) puts("Yes");
else if(ic>=3&&dc>=2&&m<=15) puts("Yes");
else if(ic>=4&&dc>=1&&m<=16) puts("Yes");
else puts("No");
}
}
1007
sort然后不断头尾相减
a[2*n]-a[1] a[2*n-1]-a[2]…
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int N=1e3+10;
int a[2*N];
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=2*n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+2*n+1);
int sum=0;
for(int i=1,j=2*n;i<=n;i++,j--){
sum+=(a[j]-a[i]);
}
printf("%d\n",sum);
}
}