第一套(搞定)
#include<stdio.h>
#include<string.h>
int main(){
int n;
scanf("%d",&n);
char s[100];
getchar();
for(int i=0;i<n;i++){
gets(s);
int cnta=0,cnte=0,cnti=0,cnto=0,cntu=0;
for(int i=0;i<strlen(s);i++){
if(s[i]=='a'){
cnta++;
}else if(s[i]=='e'){
cnte++;
}else if(s[i]=='i'){
cnti++;
}else if(s[i]=='o'){
cnto++;
}else if(s[i]=='u'){
cntu++;
}
}
printf("a:%d\n",cnta);
printf("e:%d\n",cnte);
printf("i:%d\n",cnti);
printf("o:%d\n",cnto);
printf("u:%d\n",cntu);
}
return 0;
}
第二套(搞定)
VJ输入提示Rejected by HDU WAF. Please tweak you code.
代表扫描时未换行,添加\n即可
#include<stdio.h>
#include<string.h>
int main(){
int n;
char s[10001][20];
int cnt[1001];
while(scanf("%d\n",&n)&&n!=0){
for(int i=0;i<n;i++){
scanf("%s\n",s[i]);
}
for(int i=0;i<n;i++){
cnt[i]=0;
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(strcmp(s[i],s[j])==0)
cnt[i]++;
}
}
int max=0;
int k;
for(int i=0;i<n;i++){
if(max<cnt[i]){
max=cnt[i];
k=i;
}
}
printf("%s\n",s[k]);
}
return 0;
}
第三套(搞定)
#include<stdio.h>
int main(){
int n,m;
scanf("%d %d",&n,&m);
int dp[10001];
for(int i=0;i<=m;i++){
dp[i]=0;
}
for(int i=1;i<=n;i++){
int w,d;
scanf("%d %d",&d,&w);//位置颠倒了
for(int j=m;j>=w;j--){//条件写错了
if(dp[j-w]+d>dp[j]){
dp[j]=dp[j-w]+d;
}
}
}
printf("%d\n",dp[m]);
return 0;
}
第四套(选择放弃)
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int a;
int b;
int c;
}d;
int cmp(const void*a,const void*b){
d*qa=(d*)a;
d*qb=(d*)b;
return qb->b-qa->b;
}
int main(){
int e,f;
scanf("%d %d",&e,&f);
d*list=(d*)malloc(e*sizeof(d));
for(int i=0;i<e;i++){
scanf("%d %d",&list[i].b,&list[i].c);
list[i].a=i;
}
qsort(list,e,sizeof(d),cmp);
int g=0;
int h=0;
for(int j=0;j<f;j++){
if(list[j].c>g){
g=list[j].c;
h=list[j].a;
}
}
h=h+1;
printf("%d\n",h);
free(list);
return 0;
}
第五套(搞定)
/*
1.读取死宅数量 n
2.每个死宅需要快乐a[i]点
3.所有死宅中最大的快乐需求数 ma
4.读取每个死宅需要的快乐点数
5.读取喝快乐水增加的快乐点数k
6.特殊情况k==1
7.二分法计算最短时间 l r m sum(累加额外分数)
8.输出最短时间l
*/
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int a[n];
int ma=0;//初始化勿忘
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
ma=max(ma,a[i]);
}
int k;
scanf("%d",&k);
if(k==1){
printf("%d\n",ma);
return 0;
}
int l=0,r=ma,m;
while(r>l) {//一定不要忘记在这个循环条件内运行
m=(l+r)/2;
long long sum=0;//long long一定不能省去
for(int i=0;i<n;i++){
if(a[i]>m){
sum+=(a[i]-m)/(k-1)+((a[i]-m)%(k-1)!=0);//注意是k-1,不是l
}
}
if(sum>m){
l=m+1;//是1 ,不是l
}else r=m;
}
printf("%d\n",l);
return 0;
}
第六套 (选择放弃)
#include<stdio.h>
#define N 20
int count, n;
// 使用更具描述性的参数名
void dfs(int row, int columnMask, int leftDiagonalMask, int rightDiagonalMask) {
if (row == n) {
count++;
return;
}
// 找到第一个未被占用的位置(列)
int availablePositions = ~(columnMask | leftDiagonalMask | rightDiagonalMask) & ((1 << n) - 1);
while (availablePositions) {
// 选择最右边的1,即当前行可放置皇后的列
int position = availablePositions & -availablePositions;
dfs(row + 1, columnMask | position, (leftDiagonalMask | position) << 1, (rightDiagonalMask | position) >> 1);
// 移除已尝试的位置
availablePositions &= ~position;
}
}
int main() {
while (scanf("%d", &n) == 1) {
if (n == 0) break;
count = 0;
dfs(0, 0, 0, 0);
printf("%d\n", count);
}
return 0;
}
#include<stdio.h>
#define N 20
int cnt,n;
void dfs(int k,int col,int ld,int rd){
if(k>=n){
cnt++;
return;
}else{
int pos=((1<<n)-1) & ~(col| ld|rd);
while(pos){
int p=pos & ~pos;
pos-=p;
dfs(k+1,col|p,(ld|p)<<1,(rd|p)>>1);
}
}
}
int main(){
while(scanf("%d",&n)==1){
if(n==0) break;
cnt=0;
dfs(0,0,0,0);
printf("%d\n",cnt);
}
return 0;
}
【注意】第四套和第六套之前文章当中写的代码有误,以本篇文章的为主
第四套和第六套实在太难了QAQ,打算放弃了